FOR命令不能跨越多行,除非使用括号或行连续^
。第一个左括号必须与IN相同,而第二个与DO相同。
不能在括号内的代码块中使用正常扩展,因为扩展发生在分析时间,并且整个块被一次解析。所以价值将会是你设置之前的价值!解决方案是使用延迟扩展。执行该行时会发生这种情况。必须启用setlocal enableDelayedExpansion
。
延迟扩展会导致问题,因为!
在文件名中是有效的,如果包含!
而延迟扩展被启用,则变量扩展将被破坏。解决方案是在循环内开启和关闭延迟扩展。
你想要一个简单的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将结果解析为数字和文件名,以便您可以再RENAME。
@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"
)
谢谢你,如果你的问题已回答让您满意,那么你应该接受一下附近的答案左上角的复选标记的答案完全 – JCastilloLirio
工作。该行动让其他人知道该问题已得到解答,它会授予您2个声望,并向答案提供者授予15个重要点。只能接受1个答案。一旦你达到15个重点,你将有权投票回答。你可以投多少你认为有用的答案,甚至可以回答其他人的问题。一个投票可以给答案提供者10分。 – dbenham