首页 > 解决方案 > 嵌套用于批量执行两次

问题描述

我的批处理脚本中有以下代码:

for %%m in (a b c) do (
    cd %%m
    dir
    for %%f in (*.zip) do rename "%%f" "%%m_%%f"
    dir
    cd ..
)

它应该将文件所在文件夹的名称添加到文件名中。我通过运行嵌套的 for 循环来做到这一点。

但是,当我运行脚本时,我得到以下输出(缩短,对于 a、b、c 的每个变体):

05/15/2018  04:45 AM         5,213,422 build_1.0.0.zip
05/15/2018  04:45 AM         5,213,422 a_a_build_1.0.0.zip

因此,无论出于何种原因,每个文件都会执行两次重命名,第二次是在已重命名的文件上执行。启用 echo 后,我们实际上可以看到这种情况发生:

C:\project>for %m in (a b c) do (
 cd %m     
 dir 
 for %f in (*.zip) do rename "%f" "%m_%f"  
 dir 
 cd .. 
)

...

C:\project>rename "build_1.0.0.zip" "a_build_1.0.0" 
C:\project>rename "a_build_1.0.0" "A_a_build_1.0.0" 

为什么会发生这种情况,以及如何解决它(如果可能,我宁愿保留嵌套循环,因为脚本通常会更长一些 - 但即使是这个缩短的版本也会显示这种奇怪的行为)

标签: batch-filefor-loopnested-loopsvariable-expansion

解决方案


推荐阅读