批量删除文件在包含某些特定文本的文件夹中递归删除

时间:2013-03-12 08:37:46

标签: batch-file

我想在一组文件夹上递归循环,并删除名称中包含“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'不被识别为内部或外部命令,可操作程序或批处理文件。

有人能告诉我哪里出错或者有更好的方法吗? 谢谢你的时间。

2 个答案:

答案 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" ...