Batch file 在包含特定文本的文件夹中以递归方式批删除文件
我想递归地循环一组文件夹,并删除这些文件夹中名称中包含“OUT”的所有文件。在下面的示例中,仅应删除文件夹folder1out和folder3out中的文件。 例如: 这就是我现在所拥有的:Batch file 在包含特定文本的文件夹中以递归方式批删除文件,batch-file,Batch File,我想递归地循环一组文件夹,并删除这些文件夹中名称中包含“OUT”的所有文件。在下面的示例中,仅应删除文件夹folder1out和folder3out中的文件。 例如: 这就是我现在所拥有的: cd root FOR /f %%f in ('dir /ad /b /s') do ( %%f|findstr /i OUT > nul: IF %errorlevel% == 0 ( cd %%f del . ) ) 但这会导致错误“Nam
cd root
FOR /f %%f in ('dir /ad /b /s') do (
%%f|findstr /i OUT > nul:
IF %errorlevel% == 0 (
cd %%f
del .
)
)
但这会导致错误“NameOfFolderin%%f”无法识别为内部或外部命令、可操作程序或批处理文件
有人能告诉我哪里出了问题,或者有没有更好的方法?
感谢您的时间。使用
%%f | findstr/i OUT>nul:
您试图执行一个命令%%f(这是来自for循环的文件夹名称),因此它表示该命令无法识别。因为它不是
您需要一种正确的方法来检测dir名称中的“out”。您可以使用这种语法获取变量的最后3个字符:%%f:~-3%
所以试试看:
如果/i“%%f:~-3%”==“out”…
那么,前两行似乎没问题
问题在于其余部分
%%f|findstr /i OUT > nul:
嗯,不,您需要将文件名回送到FINDSTR
并且目标字符串“OUT”
应该被引用
而且NUL
后面的冒号不是必需的,也不是常见的,而是无害的
ECHO %%f|findstr /i "OUT" > nul
常见错误。当解析逻辑命令时(这意味着从
FOR
到后面6行的右括号),任何%var%都将替换为当时的当前值%var%,然后对结果执行该命令。因此,在解析时,%ERRORLEVEL%将被ERRORLEVEL的值替换
您需要使用原始的IF ERRORLEVEL
表单,“IF ERRORLEVEL n”
,意思是“如果ERRORLEVEL为n或大于n”。此表单检查ERRORLEVEL的当前(即运行时)值
IF NOT ERRORLEVEL 1 (
(即,如果errorlevel不是(1或大于1))
是的,那会有用的。问题是您将设置%%f作为当前目录。可能是你想要的,但是
del .
呃,否-这将尝试删除当前目录中的所有文件,并需要响应
你在找什么
RD .
但您不能删除当前目录
那怎么办呢
简单的
RD %%f /S /Q
它应该删除目录%%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*
子目录。由于works的方式,您可能会发现,当您来到较低的目录时,较高的hirectory已被删除,因此较低的目录将不存在,您会收到一条丑陋的eror消息
将2>NUL
添加到RD命令应该会抑制该错误消息是否尝试调试它?谢谢,这是我所需要的全部内容,只是在我的情况下,我不想删除目录,我想清空它的内容。在不使用CD的情况下如何执行此操作?将RD..
更改为DEL/Q%%f\。
继续/Q开关并在不提示的情况下删除文件。添加/删除所有子目录中的内容。添加/F以删除只读文件<代码>**但请记住在测试期间包含回音**代码>谢谢,我是用CD和than-DEL完成的,但你的方式也很有效。
RD %%f /S /Q
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
)