我有一个批处理文件,它从目录中解压缩档案,并重命名提取的文件。我的批处理文件的内容如下:
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开始时,我如何纠正这个问题?
发布于 2016-11-11 17:53:12
给你一个解释,如果你看到你的代码执行,你就会明白地看到这一天。
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 . . .https://stackoverflow.com/questions/40549240
复制相似问题