批处理文件解压和重命名文件

问题描述:

我有一个批处理文件解压缩目录中的存档,并重命名提取的文件。我的批处理文件的内容是:批处理文件解压和重命名文件

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

尝试使用set i = 0而不是i = 1 –

+0

假设您没有禁用脚本顶部的ECHO OFF,请观察程序执行。特别注意重命名命令。如果您必须在重命名命令后放置PAUSE。 – Squashman

+0

@Byakko_Haku你的建议已经奏效,并且重命名的文件现在从1开始。谢谢你的帮助! – Klicker

对你的解释,如果你会看到你的代码执行,你会看到这个平原作为一天。

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 . . . 
+0

感谢您花时间全面解释@Squashman的问题。你的解释,这无疑是清晰明了的,和你的解决方案比最初的解决方案更加强健,使你的建议我已经改变了它,和完美的作品。 – Klicker