For loop 文件名被多次追加

For loop 文件名被多次追加,for-loop,cmd,append,dos,filenames,For Loop,Cmd,Append,Dos,Filenames,我使用批处理文件来附加多个文件名 对于文件: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 ) >

我使用批处理文件来附加多个文件名

对于文件: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 )
有人能向我解释为什么会发生这种情况,以及如何避免这个问题

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

set "nname=copy_"

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

提前谢谢

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

避免这种情况的一种方法是:

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

谢谢它工作得很好,比我做的临时文件夹工作要好得多。需要明确的是,通过将“usebackq”函数与`正在强制shell在继续之前完成*.txt的循环?/F选项允许您使用命令的输出作为“for”命令的“输入”。“usebackq”选项只是更改被视为要执行的命令的“”字符串还是``字符串。(最好添加“usebackq”选项并将命令放入
中)然后,shell将
中的文本作为命令进行处理,执行该命令,然后从该命令获取输出(命令的stdout)并逐行处理。每行按空格字符分割为标记,标记被分配给for变量。在循环中,您只有一个变量%%A,因此每行输出上只有第一个标记被分配给%%A。但是
dir/b*.txt
输出的正是您想要的:每个文件只有一行文件名。事实上,
dir…
在“for”循环开始执行之前就完成了,这只是shell的一个变幻莫测的特性——在我测试它之前,我甚至不确定这一点。