1

我一直在寻找 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
4

1 回答 1

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"
)
于 2012-10-27T23:40:45.307 回答