文件在Windows批处理文件中被多次处理...循环。为什么?

时间:2011-04-06 17:10:29

标签: batch-file

我编写了一个简单的批处理脚本来遍历特定目录中的文件,并在文件名前加上一些文本(客户端名称)。脚本运行正常;但是,目录中最近修改的文件似乎被修改了两次。我尝试了两种解决问题的方法 - 使用pushd进行目录并列出for循环中的完整路径(下面各代码)。

这两种方法我最终得到如下内容(假设第三个文件是最近修改过的文件):

原始文件名:

SomeFile1.rtf  
SomeFile2.rtf  
SomeFile3.rtf  

重命名文件名:

TextToPrepend_SomeFile1.rtf  
TextToPrepend_SomeFile1.rtf  
TextToPrepend_TextToPrepend_SomeFile1.rtf

不,这不是第三个文件的拼写错误。它第二次被处理,TextToPrepend被第二次加载。我是Windows Batch脚本的新手,我已经尝试过研究这个问题,但是找不到它为什么会这样做的原因。任何帮助表示赞赏。

代码:

pushd C:\Images\Data\

rem setlocal ENABLEDELAYEDEXPANSION

for %%X in (*.rtf) do (  
   ren "%%X" TEXTTOPREPEND_"%%X"  
)

popd

- 和 -

rem setlocal ENABLEDELAYEDEXPANSION

for %%X in (C:\Images\Data\\*.rtf) do (  
   ren "%%X" TEXTTOPREPEND_"%%~nX".rtf  
)

如果它有帮助,批处理脚本将在Windows Server 2008框上执行。

2 个答案:

答案 0 :(得分:4)

你显然错误地认为在循环开始之前会扩展glob。我知道它没有在DOS中。解决方案:

for %%X in (*.rtf) do (
   ren "%%X" "TEXTTOAPPEND_%%~nX._rtf"
)
ren *._rtf *.rtf

md tmp
for %%X in (*.rtf) do (
   move "%%X" "TEXTTOAPPEND_%%~nX.rtf"
)
move tmp\* .
rd tmp

目前不在我的Windows机器上,因此无法测试我是否可以复制您的行为。

答案 1 :(得分:3)

这似乎可以用更少的代码来解决问题:

for /f "delims=" %%X in ('dir /b *.rtf') do ren "%%X" TEXTTOPREPEND_"%%X"