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

标签 batch-file

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

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

原始文件名:

SomeFile1.rtf  
SomeFile2.rtf  
SomeFile3.rtf  

重命名的文件名:

TextToPrepend_SomeFile1.rtf  
TextToPrepend_SomeFile1.rtf  
TextToPrepend_TextToPrepend_SomeFile1.rtf

不,这不是第三个文件的拼写错误。它得到第二次处理,TextToPrepend 被第二次添加。我是 Windows 批处理脚本的新手,我曾尝试研究这个问题,但找不到这样做的原因。感谢任何帮助。

代码:

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 机器上执行。

最佳答案

您显然错误地假设 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 机器上,所以无法测试我是否可以复制您的行为。

关于batch-file - 在 Windows 批处理文件中多次处理文件...循环。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5570285/

相关文章:

mysql - 用于列出目录中文件的 Bash 脚本

java - Runtime.getRuntime().exec() 和双击执行批处理文件有什么区别?

python - 通过命令行在目录中的每个文件中运行 python 脚本

batch-file - MS-Win-CMD PushD/PopD 如何工作以及为什么不在 "For/f"-Loop 中

windows - 使用 Notepad++ 从cmd目录输出打开多个文件

windows - 为什么 windows shell 的 for 命令会替换分号?

windows - 用于搜索和替换而不跳过空行 '!' 和 ';' 的批处理脚本?

python - 在 python 中运行特定的批处理命令

batch-file - 批处理 - 计算当前文件夹和子文件夹中文件的行数

batch-file - Pandoc Windows 批处理文件构建错误路径 openBinary 文件不存在