2017-07-30 286 views
1

我正在做一个简单的批处理脚本来处理一大组文件并删除所有我不想要的。我想要的文件的10%左右,他们都有一定的标签他们的名字,可以说它们含有appleorangepear。因为有我想要删除这么多文件,这将是相当的时间来构建一个FOR循环如消费:如何使用FOR循环来处理不满足条件的文件?

@echo off 
pause 
for /R %%i in ([the list of names of the files I don't want]) do del %%i 
pause 

所以我想知道是否有可能编写它,使得它删除所有文件它没有包含appleorangepear名字?

换句话说,就是所有的文件将保留在其名称中的3个字一个不包含。

我使用FOR循环,因为这些文件是嵌套的很多子目录中,我想保持这种结构不需要的文件已被删除后。在命令行的结束del

@echo off 
for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /V /C:"apple[^\\]*$" /C:"orange[^\\]*$" /C:"pear[^\\]*$"') do ECHO del "%%I" 

此批处理代码并没有真正删除,因为命令的文件ECHO

+0

如果排除字词不存在于应该执行的路径中:@For/F Delims =“%% B in('Dir/B/S/AD”X:\ start \ folder \ *“^| Findstr/RIV“苹果橙香蕉”')做@Echo德尔“%%〜fB”'如果输出看起来确定删除回声 – LotPings

回答

0

您可以使用包含此批处理文件(或多或少)只是一个命令行。在命令提示符窗口中运行此批处理文件,并且当前目录是要删除不需要的文件并验证输出的目录树的根目录。然后删除ECHO并再次运行该批处理文件。

命令DIR在当前目录由于/S搜索和仅用于通配符模式*与由于/B这意味着输出裸格式输出匹配由于/A-D(未目录属性)文件的所有子目录仅仅包含所有找到的具有完整路径的文件的名称。

DIR输出错误信息处理STDERR如果找不到任何文件。此错误消息是由它与2>nul重定向到设备NUL抑制。重定向操作>必须在这里与插入符号^转义首先被解释为文字字符的解析由Windows命令解释器FOR命令行。

DIR的输出来处理STDOUT通过管道与|标准控制台应用程序FINDSTR其搜索在所有行的情况下不敏感,因为/I用于与/C:指定因为/R正则表达式的字符串。重定向运算符|也必须在^之间转义。

FINDSTR不支持OR表达式,它支持正则表达式。但是可以指定多个搜索字符串,这些字符串全部应用于文本的每一行,以便一个接一个地处理,直到出现正匹配或者没有更多搜索字符串。这是一个经典的OR。

正则表达式word[^\\]*$手段:

  • word ...必须有发现word(不区分大小写)。
  • [^\\]* ...查找0个或多个字符不是反斜线。
  • $ ...必须在行末找到匹配字符串。

正则表达式来获得一个正匹配仅适用于该文件名包含任何appleorangepear,但不是文件路径线。

但还有一个FINDSTR选项:/V。该选项将结果输出反转以处理STDOUT。所以输出是3个正则表达式中的产生正匹配的行。

命令FOR处理由FINDSTR每条输出线用作用于输出DIR负过滤器和用于每个运行行的命令DEL分别ECHO不分割线成空间/标签由于delims=而分隔的字符串。

就是这样。

如果存储在由命令DIR处理的目录树中,需要防止删除批处理文件。通过在批处理文件中设置只读属性,可以非常容易地实现该操作,如命令DEL不会删除只读属性设置的文件。

实施例:

@echo off 
rem Prevent batch file from deletion by setting read-only attribute on batch file. 
%SystemRoot%\System32\attrib.exe +r "%~f0" 

for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R /V /C:"apple[^\\]*$" /C:"orange[^\\]*$" /C:"pear[^\\]*$"') do del "%%I" 

rem It is safe to remove read-only attribute from batch file. 
%SystemRoot%\System32\attrib.exe -r "%~f0" 

上面的批量代码没有ECHO命令del之前并且因此真正删除上执行的文件。

为了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • attrib /?
  • del /?
  • dir /?
  • echo /?
  • findstr /?
  • for /?
  • rem /?

另请参阅Microsoft有关Using Command Redirection Operators的文章,以获得对|2>nul的解释。