好吧,前两行似乎没问题。
问题在于其余部分。
%%f|findstr /i OUT > nul:
嗯,不,您需要ECHO
输入文件名,并且应该引用FINDSTR
目标字符串,并且后面的冒号不是必需的或通常的 - 但无害。"OUT"
NUL
ECHO %%f|findstr /i "OUT" > nul
IF %errorlevel% == 0 (
常见错误。当LOGICAL命令被解析时(这意味着从FOR
6 行到右括号),任何 %var% 都被替换为 %var% 的当前值,然后在结果上执行命令。因此,%ERRORLEVEL% 将被 PARSE-TIME 的 ERRORLEVEL 值替换。
您需要使用原始IF ERRORLEVEL
表单,"IF ERRORLEVEL n"
即“如果错误级别为 n 或大于 n”此表单检查 ERRORLEVEL 的 CURRENT(即 RUN-TIME)值。
IF NOT ERRORLEVEL 1 (
(即,如果 errorlevel 不是(1 或大于 1))
cd %%f
是的,这会奏效。问题是您会将 %%f 设置为当前目录。可能看起来是你想要的,但是...
del .
呃,不 - 这将尝试删除当前目录中的所有文件并需要响应。
你正在寻找
RD .
但是您不能删除当前目录。
那么该怎么办?
简单的
RD %%f /S /Q
应该删除目录 %%f 及其子目录 (/s) 并且不提示权限 (/Q)
BUT PLEASE INSERT AN ECHO BEFORE THIS COMMAND FOR TESTING
以便显示建议的删除而不是执行(如果出现错误......)
ECHO RD %%f /S /Q
所以你修改后的批次变成了
cd root
FOR /f %%f in ('dir /ad /b /s') do (
ECHO %%f|findstr /i "OUT" > nul
IF NOT ERRORLEVEL 1 (
ECHO RD %%f /S /Q
)
)
这可以通过使用更简单地完成
cd root
FOR /f %%f in ('dir /ad /b /s *OUT*') do (
ECHO RD %%f /S /Q
)
最后一个问题可能是您可能希望删除一个*OUT*
本身包含子目录的*OUT*
子目录。由于 FOR 的工作方式,您可能会发现,当您来到 lower-down 目录时,higher-down 目录已经被删除,因此 lower 目录将不存在,并且您会收到一条丑陋的错误消息。
附加2>NUL
到 RD 命令应该抑制该错误消息