使用.bat重命名多个文件

时间:2012-10-27 23:03:32

标签: batch-file

我一直在Windows 7中寻找一个给出名称和文件目录的.bat文件,将该目录中的所有文件重命名为用户传递的名称连接到0到9之间的数字。 例如: 假设我有一个包含两个文件a.txt和b.txt的目录,我想将它们的名称更改为documentX.txt(X是0到9之间的数字),所以最后脚本会将名称更改为document1.txt和document2.txt

我尝试了类似的东西,但没有成功:

    @echo off
    @set a=1
    @set pref=hola

    for /D %%f in (C:\*.txt) 
     do 
     rename *.txt %pref%%a%
     @set /A a = %a%+1

1 个答案:

答案 0 :(得分:1)

除非使用括号或行继续^,否则FOR命令不能跨越多行。第一个左括号必须与IN在同一行上,第二个与DO在同一行上。

您不能在也设置值的带括号的代码块中使用常规扩展,因为扩展发生在分析时并且整个块一次被解析。因此,该值将是您设置之前存在的值!解决方案是使用延迟扩展。执行该行时会发生这种情况。必须使用setlocal enableDelayedExpansion启用它。

延迟扩展会导致问题,因为!在文件名中有效,如果在启用延迟扩展时包含!,则FOR变量扩展将会损坏。解决方案是在循环内打开和关闭延迟扩展。

你想要一个没有任何选项的简单FOR。 /D选项查找目录而不是文件。

您无需在SET /A语句中扩展数值变量。

最后一件事 - 使用@后无需ECHO OFF

@echo off
setlocal disableDelayedExpansion
set "n=0"
set "pref=document"

for %%F in (c:\*.txt) do (
  set "file=%%F"
  set /a n+=1
  setlocal enableDelayedExpansion
  ren "!file!" "%pref%!n!.txt"
  endlocal
)

有一种更简单的方法可以完成任务。使用DIR /B列出所有.txt个文件,并将结果通过管道传输到FINSTDR /N "^"。 FINDSTR将匹配所有文件,并为每个值添加一个序号后跟一个冒号。使用FOR / F将结果解析为数字和文件名,以便您可以重命名。

@echo off
setlocal
set "pref=document"
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d *.txt^|findstr /n "^"') do (
  ren "%%B" "%pref%%%A.txt"
)