2012-07-31 44 views
2

我正在使用批处理文件追加多个文件名。文件名不止一次附加

对于文件:的1.txt,2.txt,3.txt,4.txt,5.txt - 我想用copy_1.txt

set "nname=copy_" 

for %%A in (*.txt) do (
ren %%A %nname%%%A 
) 
exit 

但是追加,循环出现环回到第一个文件并重新附加文件名。

这里是CMD输出:

> for %A in (*.txt) do (ren %A copy_%A) 
> (ren 1.txt copy_1.txt) 
> (ren 2.txt copy_2.txt) 
> (ren 3.txt copy_3.txt) 
> (ren 4.txt copy_4.txt) 
> (ren 5.txt copy_5.txt) 
> (ren copy_1.txt copy_copy_1.txt) 

可为什么这是发生有人向我解释,可以如何avaoid这个问题呢?

我试图添加一个“异常处理程序”,但它没有用。

set "nname=copy_" 

for %%A in (*.txt) do (
if exist %nname%%%A goto :exit 
ren %%A %nname%%%A 
) 
:exit 
echo file exists 

在此先感谢!

回答

1

shell在开始处理重命名命令之前未完成其文件列表,因此第一个重命名命令的结果(即copy_1.txt)与* .txt匹配。

的一种方式,以避免它:

for /F "usebackq" %%A in (`dir /b *.txt`) do (ren %%A %nname%%A) 
+0

谢谢!它效果很好,比我做的临时文件夹工作要好得多。要明确一点,通过使用“usebackq”函数,在执行shell之前完成* .txt的循环之前? – 2012-07-31 18:32:02

+0

/F选项允许您将命令的输出用作“for”命令的“输入”。 “usebackq”选项只是简单地改变它是一个''字符串还是一个被视为要执行的命令的字符串。 (最好添加“usebackq”选项并将你的命令放在''中)。接下来会发生的事情是shell将''作为命令处理文本中的文本,执行该命令,然后从该命令中获取输出(来自命令的stdout)并逐行处理它。每行都以空格字符分割为标记,并将标记分配给for变量。 – 2012-08-01 14:58:55

+0

在循环中,只有一个变量%% A,因此只有输出每行上的第一个标记被分配给%% A。但是'dir/b * .txt'完全可以输出你想要的结果:每个文件只有一行,只有文件名。在“for”循环开始执行之前完成“dir ...”这一事实只是一个虚拟的shell - 我直到测试它时才确定。 – 2012-08-01 15:00:03