Windows 如何删除批处理文件中的文件列表

Windows 如何删除批处理文件中的文件列表,windows,batch-file,Windows,Batch File,我正在尝试使用批处理脚本从目录及其子目录中删除所有非代码文件。使用命令提示符,我可以验证脚本的结果,但在执行脚本时,它不会执行预期的操作 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 .

我正在尝试使用批处理脚本从目录及其子目录中删除所有非代码文件。使用命令提示符,我可以验证脚本的结果,但在执行脚本时,它不会执行预期的操作

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"

为什么我的%%F变量没有指向一个文件,因为“for/F”应该导致它这样做?

for/F命令将每行解析为标记,默认标记分隔符是
,默认情况下,只保留第一个标记。您需要通过将DELIMS设置为nothing来强制整行成为一个令牌。此外,下线选项为
表示以
开头的任何行将被跳过。从技术上讲,文件夹或文件名可以以
开头,因此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"

你的解释使我安心。我肯定会把它放在一个BAT文件中,并保持它,虽然对于记录我使用C++和Boost来执行这个任务后放弃了对Windows批处理的调试和错误调试: