我正在尝试使用批处理脚本从目录及其子目录中删除所有非代码文件。使用命令提示符我可以验证脚本的结果,但是当脚本执行时,它不会执行人们期望的操作。
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'应该导致它?
答案 0 :(得分: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"