批处理文件重命名中出现意外循环

时间:2014-07-18 04:08:02

标签: batch-file

我使用的是XP Pro SP3,使用“.cmd”文件重命名一组文件。

...假设我有以下文件......
111.aaa
222.aaa
333.aaa
111.bbb
222.bbb
333.bbb
111.ccc
222.ccc
333.ccc
111.ddd
222.ddd
333.ddd
111.eee
222.eee
333.eee

...我使用以下代码重命名文件......

for %%i in (*.ddd *.aaa) do ren "%%i" "---------- %%~i"  
for %%i in (*.aaa *.bbb *.ccc *.ddd *.eee) do ren "%%i" "xxxxx %%i"  

......我最终得到了以下内容...... xxxxx ---------- 222.aaa
xxxxx ---------- 333.aaa
xxxxx xxxxx ---------- 111.aaa
xxxxx 222.bbb
xxxxx 333.bbb
xxxxx xxxxx 111.bbb
xxxxx 222.ccc
xxxxx 333.ccc
xxxxx xxxxx 111.ccc
xxxxx ---------- 222.ddd
xxxxx ---------- 333.ddd
xxxxx xxxxx ---------- 111.ddd
xxxxx 222.eee
xxxxx 333.eee
xxxxx xxxxx 111.eee

第一行代码找到“aaa”和“ddd”文件,并用破折号作为文件名的前缀。
第二行代码在所有文件名前面加上Xs - 然而,每组中的第一个文件第二次被处理,这既不是预期的,也不是我们想要的!

在研究时,我看到了对ENABLEDELAYEDEXPANSION,令牌或delims的引用 - 但我找不到我需要的例子来解决我的问题。

任何建议?

谢谢......

PS:这是一个真正的冒险格式化这篇文章;它不是记事本复制和粘贴友好...

2 个答案:

答案 0 :(得分:1)

for /f "delims=" %%i in ('dir /b /a-d *.ddd *.aaa') do ren "%%i" "---------- %%~i"  

应该解决你的问题(以同样的方式修改你的第二行。)

似乎正在发生的事情是for %%i...在遇到文件名时会对其进行处理,但第二档会对名称进行重新排序,因此可能会再次遇到新名称。

dir命令在内存中构建文件名列表,然后处理列表,以便绕过更改的目录序列。

答案 1 :(得分:0)

恐怕我不明白你的问题究竟是什么。这是你的代码:

for %%i in (*.ddd *.aaa) do ren "%%i" "---------- %%~i"  
for %%i in (*.aaa *.bbb *.ccc *.ddd *.eee) do ren "%%i" "xxxxx %%i"

这是您的代码/问题的描述:

  

第一行代码找到" aaa"和" ddd"文件和前言   带有破折号的文件名。第二行代码序列全部   带有Xs的文件名 - 然而,每个组中的第一个文件得到   第二次处理,这既不是意图也不是期望!

如果您希望处理第二行中的* .ddd或* .aaa文件,请在第二行中使用此文件:

for %%i in (*.bbb *.ccc *.eee) do ren "%%i" "xxxxx %%i"

也许您对问题的描述不够明确?