用于解压缩和重命名文件的批处理文件

时间:2016-11-11 13:41:13

标签: windows batch-file cmd

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

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开始正确?

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