3

バッチスクリプトを使用して、ディレクトリとそのサブディレクトリからすべての非コードファイルを削除しようとしています。コマンドプロンプトを使用して、スクリプトの結果を確認できますが、スクリプトを実行すると、期待するアクションが実行されません。

for /F %%F in ('dir /s /b /a-d ^| findstr /vile ".c .cpp .h .hpp"') do if "%%~fF" neq      "%~f0" del /S /Q "%%F"

次のコマンドを抽出して実行すると、生成されるパスは正しくなります。

dir /s /b /a-d | findstr /vile ".c .cpp .h .hpp"

ただし、バッチファイルを介して実行すると、「del / S / Q "%% F"」コマンドに送信される結果のパスは、最初のサブディレクトリに何度も送信されます。

以下は、コマンドプロンプト出力とバッチファイル出力(delコマンドをechoに置き換えたもの)の比較です。

コンソール:

C:\testdata\delete_test>dir /s /b /a-d | findstr /vile ".c .cpp .h .hpp"
C:\testdata\delete_test\delete_non_code_files.bat
C:\testdata\delete_test\delete_test - Copy\7328_log.txt
C:\testdata\delete_test\delete_test - Copy\7588_log.dat
C:\testdata\delete_test\delete_test - Copy\7964_log.txt
C:\testdata\delete_test\delete_test - Copy\8860_log.txt
C:\testdata\delete_test\delete_test - Copy (2)\7328_log.txt
C:\testdata\delete_test\delete_test - Copy (2)\7588_log.dat
C:\testdata\delete_test\delete_test - Copy (2)\7964_log.txt
C:\testdata\delete_test\delete_test - Copy (2)\8860_log.txt
C:\testdata\delete_test\delete_test - Copy (3)\7328_log.txt
C:\testdata\delete_test\delete_test - Copy (3)\7588_log.dat
C:\testdata\delete_test\delete_test - Copy (3)\7964_log.txt
C:\testdata\delete_test\delete_test - Copy (3)\8860_log.txt

バッチファイル:

C:\testdata\delete_test>delete_non_code_files.bat
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"
/S /Q "C:\testdata\delete_test\delete_test"

'for / F'がファイルを指すように、%% F変数がファイルを指さないのはなぜですか?

4

1 に答える 1

3

FOR / Fコマンドは、各行をトークンに解析します。デフォルトのトークン区切り文字は<space><tab>デフォルトでは、最初のトークンのみが保持されます。DELIMSをnoに設定して、行全体を1つのトークンにする必要があります。また、EOLオプションは;デフォルトであり、で始まる行は;スキップされます。技術的には、フォルダまたはファイル名はで始まる可能性が;あるため、EOLオプションは有効なパスを開始できないものに設定する必要があります。は:良い候補です。

まったく関係ありませんが、この状況では/Sまたは/Qオプションは必要ありません。

for /F "eol=: delims=" %%F in ('dir /s /b /a-d ^| findstr /vile ".c .cpp .h .hpp"') do if "%%~fF" neq "%~f0" del "%%F"
于 2013-01-06T23:48:48.743 に答える