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

时间:2011-07-14 10:03:28

标签: windows scripting batch-file

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

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

重命名:

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”

希望你能帮我解决这个问题。我已经试着这几周了。

2 个答案:

答案 0 :(得分:5)

带有计数(FOR)的简单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

答案 1 :(得分:1)

这是一个难以解决的难题。

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 regular expression renaming utility了。它是纯脚本(混合批处理/ 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 /??