Batch file 在包含特定文本的文件夹中以递归方式批删除文件

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

我想递归地循环一组文件夹,并删除这些文件夹中名称中包含“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 .
    )
)
但这会导致错误“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
)