2016-11-11 16 views
-1

ディレクトリ内のアーカイブを解凍し、抽出したファイルの名前を変更するバッチファイルがあります。私のバッチファイルの内容は次のとおりです。ファイルを解凍して名前を変更するバッチファイル

私はファイルが

FileName1.xml 
FileName2.xml 
FileName3.xml 
... 

と改名されることを期待

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 

しかし、名前を変更したファイル名が、私は再実行した場合2ではなく1から始めるように見えますバッチファイルが最初に抽出され、2から始まって間違って名前が変更された後、バッチファイルはこの命名エラーを修正して1から始まります。

名前を変更したファイルが正しく1から始まるように修正するにはどうすればよいですか?

+1

i = 1の代わりにset i = 0を使用してください。 –

+0

スクリプトの先頭でECHOを無効にしていないと仮定して、プログラムの実行を監視します。具体的には、renameコマンドを見てください。 renameコマンドの後にPAUSEを入れる必要がある場合。 – Squashman

+0

@Byakko_Hakuあなたは提案がうまくいっていて、名前が変更されたファイルは今から1から始まります。ご協力いただきありがとうございます! – Klicker

答えて

2

あなたの説明と、あなたがCODEを実行しているのを見ていたら、このPLAINを1日として見たでしょう。

FORコマンドは、現在のフォルダ内のファイルを一度に1ファイルずつ繰り返します。たとえば、A.txt、B.txt、およびZ.txtという名前のフォルダに3つのファイルがある場合、FORコマンドは最初にA.txtを処理し、File1.txtに名前を変更します。 B.txtは、次のファイルのアルファベット順であり、File2.txtという名前に変更されているため、B.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コマンドの出力を解析するように変更すると、目的の結果が得られます。 DIRコマンドは、FORコマンドが処理を引き継ぎ、出力の処理を開始する前に、すべての処理を最初に行います。

ので、コードを変更:

@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

関連する問題