2013-01-06 67 views
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" 

然而,通過批處理文件執行時,它被髮送到「刪除/ S/Q得到的路徑「 %% F「'命令是第一個子目錄。

以下是命令提示輸出的比較和批處理文件輸出(與由回波取代del命令)

控制檯:

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" 

爲什麼我的%% F變量指向一個文件,因爲'for/F'會導致它執行?

回答

3

FOR/F命令將每一行解析爲令牌,默認令牌分隔符分別爲<space><tab>,默認情況下只保留第一個令牌。您需要通過將DELIMS設置爲無,將整條生產線強制爲一個令牌。另外,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" 
+0

您的解釋讓我放心。我肯定會將它粘貼到bat文件中並保留它,儘管在放棄對Windows批處理的試錯調試後,我使用C++和Boost來執行此任務:) – Patillac

相關問題