我编写了一个简单的批处理脚本来遍历特定目录中的文件,并在文件名前加上一些文本(客户端名称)。脚本运行正常;但是,目录中最近修改的文件似乎被修改了两次。我尝试了两种解决问题的方法 - 使用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框上执行。
答案 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"