我想在一组文件夹上递归循环,并删除名称中包含“OUT”的文件夹中的所有文件。在下面的示例中,只应删除文件夹folder1out和folder3out中的文件。 E.g:
root
folder1
folder1out
file1
file2
folder2
folder3
file1
folder3out
file1
file2
这就是我现在所拥有的:
cd root
FOR /f %%f in ('dir /ad /b /s') do (
%%f|findstr /i OUT > nul:
IF %errorlevel% == 0 (
cd %%f
del .
)
)
但这给了我错误'nameofthefolderin %% f'不被识别为内部或外部命令,可操作程序或批处理文件。
有人能告诉我哪里出错或者有更好的方法吗? 谢谢你的时间。
答案 0 :(得分:1)
嗯,前两行似乎没问题。
问题在于其余部分。
%%f|findstr /i OUT > nul:
嗯,不需要ECHO
文件名FINDSTR
并且应引用目标字符串"OUT"
<{1}}之后的结肠不是必需的或通常的 - 但是无害的。
NUL
ECHO %%f|findstr /i "OUT" > nul
常见错误。当解析 LOGICAL 命令时(这意味着从IF %errorlevel% == 0 (
到其后的右括号6行),任何%var%都被当前的%var%值替换然后命令在结果上执行。因此,%ERRORLEVEL%将被PARSE-TIME的ERRORLEVEL值替换。
您需要使用原始的FOR
表单,IF ERRORLEVEL
表示“如果错误级别是n或大于n”此表单检查CURRENT(即.RUN) -TIME)ERRORLEVEL的值。
"IF ERRORLEVEL n"
(即,如果errorlevel不是(1或大于1))
IF NOT ERRORLEVEL 1 (
是的,那会起作用的。问题是你要设置%% f作为当前目录。可能看起来像你想要的,但是......
cd %%f
呃,不 - 那将尝试删除当前目录中的所有文件并需要回复。
您正在搜索
del .
但是你无法删除当前目录。
那么 - 该怎么办?
简单
RD .
哪个应删除目录%% f及其子目录(/ s)并且不提示授权(/ Q)
RD %%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*
子目录。由于FOR的工作方式,您可能会发现当您进入下游目录时,较高的目录已被删除,因此较低的目录将不存在,您将收到一条丑陋的错误消息。
将*OUT*
附加到RD命令应该禁止该错误消息
答案 1 :(得分:0)
使用%%f|findstr /i OUT > nul:
,您正在尝试执行命令%% f(来自FOR循环的文件夹名称),因此它说它不被识别为命令。因为它不是。
您需要一种正确的方法来检测目录名称中的“out”。您可以使用这种语法获取变量的最后3个字符:
%%f:~-3%
所以试试:
if /i "%%f:~-3%"=="out" ...