如何在批处理脚本中的多个文件上重命名并添加递增数字后缀?

我有500个文件进来,我需要首先检查是否存在任何文件,然后重命名所有这些,而不pipe它们的文件名是什么(文件以不同的语言命名)。

无需以任何顺序处理它们。

改名:

1. “¦X¼d¬f-20110703-¦+¦dñHÑ-ª-¦=¬¦.xls” 2. “¦X¼d¬f-20110707-¦+¡¦-+¡8.xls” 3. “¦X¼d¬f-20110707-¦+¡¦ñj¦«.xls” 4. “¦X¼d¬f-20110708-¦+¡¦¬M¼n.xls” 5. “¦X¼d¬f-20110713-¦d¼O¼n¦hÑP.xls” . . . 500 

至:

 “TWN_CH_INV_VISIT_FORM_01.xls” “TWN_CH_INV_VISIT_FORM_02.xls” “TWN_CH_INV_VISIT_FORM_03.xls” “TWN_CH_INV_VISIT_FORM_04.xls” “TWN_CH_INV_VISIT_FORM_05.xls” . . . “TWN_CH_INV_VISIT_FORM_500.xls” 

希望你能帮助我。 我一直试图这样做几个星期。

一个简单的与计数( SET /A )应该做你所需要的。

 setlocal enabledelayedexpansion SET /A COUNT=0 FOR %%A IN (*.xls) DO ( SET /A COUNT+=1 REN "%%A" "TWN_CH_INV_VIST_FORM_!COUNT!.xls" ) 

请参阅HELP FORHELP SET

这是一个看似难以解决的问题。

5岁的PA答案有一些问题。

1)FOR循环开始迭代而不缓冲整个目录树,所以它有可能重命名已经重命名的文件。 我相信这就是为什么在r0mmel评论中缺少7个文件。

2)扩展变量后出现延迟扩展,所以文件名将被破坏,如果名称包含! 字符。

3)如果已经存在具有相同编号的TWN_CH_INV_VIST_FORM_n.xls文件,重命名可能失败。

起初我以为我可以用下面的方法来解决这个问题:

 @echo off for /f "delims=: tokens=1*" %%A in ( 'dir /b *.xls ^| findstr /n "^"' ) do ren "%%B" "TWN_CH_INV_VIST_FORM_%%A.xls.new" ren *.txt.new *. 

我使用DIR / B列出文件,并将结果传送给FINDSTR,以便用行号加一个冒号前缀每个文件名。

然后我使用FOR / F迭代并将结果解析为数字和文件名。 FOR / F在迭代之前缓冲整个结果,所以我不必担心两次重命名相同的文件。

我首先给重命名的文件一个.xls.new “扩展名”,以防万一您的目录已经有符合TWN_CH_INV_VIST_FORM_n.xls模式的文件。 你不想要任何名称冲突。 最后的REN命令然后简单地删除.new扩展名离开想要的.xls

但是 ,我只注意到原来的文件名有很多奇怪的字符,可能涉及不在当前代码页中的unicode。 FOR / F与unicode不兼容。

还有一个小问题,就是上面没有把数字填充到一个固定的宽度。 (这可以很容易地解决)

所以现在是时候打破我的JREN.BAT正则表达式重命名实用程序 。 这是纯粹的脚本(混合批处理/ JScript),可以从XP以后的任何Windows机器上本机运行。 它有一个内置的工具,以新的名称包含一个固定宽度递增的数字,并且与unicode一起工作正常。 我仍然暂时给这个新名称添加“.xls.new”扩展名,以避免名称冲突。

 @echo off call jren "^.*" "'TWN_CH_INV_VIST_FORM_'+$n+'.xls.new'" /j /npad 3 /fm *.xls ren *.xls.new *. 

我选择填充递增的数字为3位而不是2位,因为OP表示可能有500个文件。

JREN.BAT的完整文档可以从命令行通过jren /? ,还是jren /?? 如果你想分页输出。