我一直在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
答案 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"
)