我有一个批处理文件,可以从目录中解压缩存档,并重命名提取的文件。我的批处理文件的内容是:
for /F %%I IN ('dir /b /s *.zip *.rar') DO (
"C:\Program Files\7-Zip\7z.exe" x -o"%%~dpI" "%%I" -aoa
)
DEL *.zip
@echo off
set i=1
for %%f in (*.xml) do call :renameit "%%f"
goto done
:renameit
ren %1 FileName%i%_Msd.xml
set /A i+=1
:done
我希望将文件重命名为
FileName1.xml
FileName2.xml
FileName3.xml
...
但是,重命名的文件名似乎从2而不是1开始。如果我在最初提取并从2开始错误地重命名后重新运行批处理文件,它会更正此命名错误并从1开始。
如何更正这一点,以便重命名的文件从1开始正确?
答案 0 :(得分:2)
对你的解释,如果你看过你的CODE,你就会看到这个PLAIN当天。
FOR命令一次迭代当前文件夹中的文件一个文件。因此,例如,如果文件夹中有三个文件名为A.txt,B.txt和Z.txt,则FOR命令首先处理A.txt并将其重命名为File1.txt。然后它会看到B.txt,因为它是按字母顺序排列的下一个文件,并将其重命名为File2.txt。现在因为你将A.txt重命名为File1.txt,它会看到下一个文件并将其重命名为File3.txt。之后它会看到Z.txt并将其重命名为File4.txt。所以问题不在于你的计数器变量,而是FOR命令如何处理文件夹中的文件。
现在,如果您测试此代码。
@echo off
dir /b *.txt
set i=1
for %%f in (*.txt) do call :renameit "%%f"
pause
GOTO :EOF
:renameit
@ECHO ON
ren %1 FileName%i%.txt
@ECHO OFF
set /A i+=1
您的输出将如下所示。
A.txt
B.txt
Z.txt
C:\test>ren "A.txt" FileName1.txt
C:\test>ren "B.txt" FileName2.txt
C:\test>ren "FileName1.txt" FileName3.txt
C:\test>ren "Z.txt" FileName4.txt
Press any key to continue . . .
现在,如果您更改为使用FOR / F命令来解析DIR命令的输出,您将获得所需的结果。在FOR命令接管并开始处理输出之前,DIR命令将首先完成所有处理。
所以改变代码:
@echo off
dir /b *.txt
set i=1
for /F "delims=" %%f in ('dir /a-d /b *.txt') do call :renameit "%%f"
pause
GOTO :EOF
:renameit
@ECHO ON
ren %1 FileName%i%.txt
@ECHO OFF
set /A i+=1
您的输出现在就是这个。
A.txt
B.txt
Z.txt
C:\test>ren "A.txt" FileName1.txt
C:\test>ren "B.txt" FileName2.txt
C:\test>ren "Z.txt" FileName3.txt
Press any key to continue . . .