2013-03-12 43 views
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”不被识别为一个内部或外部命令,可操作的程序或批处理文件。

有人能告诉我我要去哪里吗?或者有更好的方法来做到这一点? 谢谢你的时间。

+0

您是否尝试过调试吗? – 2013-03-12 10:18:22

回答

1

好,前两行似乎确定。

问题与其余。

%%f|findstr /i OUT > nul: 

嗯,没有您需要的文件名ECHOFINDSTR 和目标串"OUT"应该被引用 和NUL冒号后是没有必要或往常一样 - 但无害。

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

IF %errorlevel% == 0 (

常见的错误。当对LOGICAL命令进行解析(并且这意味着从FOR直到后面的6个关闭括号),ANY%var%将被替换为当前值%var%,然后对结果执行该命令。因此,%ERRORLEVEL%将被在PARSE-TIME处的ERRORLEVEL值所替代。

您需要使用原始IF ERRORLEVEL形式,"IF ERRORLEVEL n"这意味着“如果错误级别为N或多于N”这种形式阐述了当前的(即运行时)ERRORLEVEL的值。

IF NOT ERRORLEVEL 1 (

(即如果错误级别不(超过11或更大))


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工作方式的原因,您可能会发现,当您到达较低层目录时,较高的工作区已被删除,因此较低的目录将不存在,并且您会收到一条丑陋的eror消息。

追加2>NUL到RD命令应该抑制错误信息

+0

谢谢,这完全是我所需要的,除了在我的情况下我不想删除目录,我想清空它的内容。我应该怎么做,而不使用CD? – hhoud 2013-03-12 15:16:33

+0

将'RD ...'更改为'DEL/Q %% f \。“/ Q开关继续前进并删除文件而不提示。 Add/S也可以在所有子目录中删除。添加/ F删除只读文件。 ''但是请记住在测试期间包括ECHO!**' – Magoo 2013-03-12 15:25:51

+0

谢谢,我用CD和DEL完成了它,但你的方法也行得通。 – hhoud 2013-03-12 15:41:39

0

With %%f|findstr /i OUT > nul:您试图执行命令%% f(这是一个来自FOR循环的文件夹名称),所以它说它不被识别为命令。因为它不是。

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

相关问题