【问题标题】:Filename is appended more than once文件名被多次附加
【发布时间】:2012-07-29 10:55:54
【问题描述】:

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

对于文件: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

提前致谢!

【问题讨论】:

    标签: for-loop cmd append dos filenames


    【解决方案1】:

    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”选项并将您的命令作为命令放在.) What happens then is that the shell processes the text within the 中,执行该命令,然后从该命令获取输出(来自命令的标准输出)并逐行处理它。每一行在空格字符处被分割成tokens,tokens被分配给for变量。
    • 在您的循环中,您只有一个变量 %%A,因此只有每行输出的第一个标记被分配给 %%A。但是dir /b *.txt 输出的正是您想要的:每个文件一行仅包含文件名。 dir ... 在“for”循环开始执行之前完成的事实只是 shell 的一个变幻莫测 - 在我测试之前我什至不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多