2016-11-11 153 views
-1

我有一個批處理文件解壓縮目錄中的存檔,並重命名提取的文件。我的批處理文件的內容是:批處理文件解壓和重命名文件

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

回答

2

對你的解釋,如果你會看到你的代碼執行,你會看到這個平原作爲一天。

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

相關問題