0

我想递归地遍历一组文件夹并删除这些文件夹中的所有文件,这些文件的名称中包含“OUT”。在下面的示例中,仅应删除文件夹 folder1out 和 folder3out 中的文件。例如:

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' 不是内部或外部命令、可运行程序或批处理文件。

有人可以告诉我哪里出错了,或者是否有更好的方法来做到这一点?感谢您的时间。

4

2 回答 2

1

好吧,前两行似乎没问题。

问题在于其余部分。

%%f|findstr /i OUT > nul: 

嗯,不,您需要ECHO输入文件名,并且应该引用FINDSTR 目标字符串,并且后面的冒号不是必需的或通常的 - 但无害。"OUT"NUL

ECHO %%f|findstr /i "OUT" > nul

IF %errorlevel% == 0 (

常见错误。当LOGICAL命令被解析时(这意味着从FOR6 行到右括号),任何 %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 命令应该抑制该错误消息

于 2013-03-12T13:38:52.630 回答
0

随着%%f|findstr /i OUT > nul:您尝试执行命令 %%f (这是来自 FOR 循环的文件夹名称),因此它表示它未被识别为命令。因为它不是。

您需要一种正确的方法来检测目录名称中的“out”。您可以使用这种语法获取变量的最后 3 个字符:
%%f:~-3%
所以尝试:
if /i "%%f:~-3%"=="out" ...

于 2013-03-12T13:09:16.503 回答