Windowsbatch file在FOR循环中无法解释地重命名文件名

Windowsbatch file在FOR循环中无法解释地重命名文件名

我有一个小的Windows 7batch file来重命名MP3文件名的库。 在这个问题中,我只包含了最后几行代码。 它工作正常,除了一个代码段的问题,从一个variables附加到目录中的每个文件名string的文本(艺术家的名字)。 (解决之后,我的batch file将使用“set / p var =”提示input文本来填充variables。)

这个testing使用的两个示例文件名是:

01-serious song.mp3 02-happy song.mp3 

这部分代码导致一个问题:

 @echo off setlocal enabledelayedexpansion ::Temporay test variable set str=Artist- for %%a in (*.mp3) do ( set oldName=%%a set newName=!str!!oldName! ren "!oldName!" "!newName!" ) endlocal 

结果是02文件以string附加一次(按预期),而01文件名得到string附加两次(错误):

 Artist-Artist-01-serious song.mp3 Artist-02-happy song.mp3 

我已经梳理了互联网,没有发现这种情况的一个讨论。 而且我不喜欢说我自己花了大约8个小时的时间。 经过多次testing和研究,我认为重命名声明是造成这种情况的原因。

所以我改变了这个batch file,用rename命令调用一个子程序,认为它干扰了for语句。 那仍然有问题。 然后我使用echo命令编辑了batch file,如下所示进行testing。

第二版testing:

 @echo off setlocal enabledelayedexpansion set str=Artist- for %%a in (*.mp3) do ( set oldName=%%a set newName=!str!!oldName! call :Action echo. echo back in For loop ) echo. echo For loop completed echo !oldName! echo !newName! endlocal goto:eof :Action echo. echo start of Action loop echo !oldName! echo !newName! ren "!oldName!" "!newName!" echo end of Action loop 

这是CMD屏幕上显示的结果输出:

 start of Action loop 01-serious song.mp3 Artist-01-serious song.mp3 end of Action loop back in For loop start of Action loop 02-happy song.mp3 Artist-02-happy song.mp3 end of Action loop back in For loop start of Action loop Artist-01-serious song.mp3 Artist-Artist-01-serious song.mp3 end of Action loop back in For loop For loop completed Artist-01-serious song.mp3 Artist-Artist-01-serious song.mp3 

这很有趣,因为它显示子程序正确地被调用并返回两次。 然后不知何故第三次被调用,在那里显然重新命名01文件,第二次附加variables。

如果我在ren语句之前放置回显,那么屏幕输出显示子程序只调用了两次,但是当然不会重命名这些文件。 我也尝试使用移动命令而不是重命名,并得到相同的问题结果。

所以,我的问题是,为什么for循环调用子程序三次,并使01文件得到处理两次,我怎样才能使其按预期工作?

谢谢皮特

Solutions Collecting From Web of "Windowsbatch file在FOR循环中无法解释地重命名文件名"

尝试

 for /f "delims=" %%a in (' dir /b /ad *.mp3') do ( 

问题是你的原始语法找到下一个文件名 – 它找到你的重命名文件,因为新的文件名(前缀)在逻辑上比'旧'大。

使用dir生成一个文件名列表,并在列表完成之后处理列表 – 因此列表不会随文件重命名而变化。

"delims="子句确保对文件名的默认解析是无效的,否则文件名将被解释为一系列[空格分隔]标记。

取代这个:

 (* .mp3)中的%% a做(
  设置oldName = %% a
  设置newName =!str !! oldName!
   ren“!oldName!”  “!新名字!”
 )

接着就,随即:

 for / f“delims =”%% a in('dir / b / ad * .mp3')do(
  设置“oldName = %%〜a”
  设置“newName =%str%!oldName!”
   ren“!oldName!”  “!新名字!”
 )

我可以稍后解释一下,如果你想这样做,但彼得是更快:)