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"
)