Batch file 如何使用FOR循环对不';你不能满足条件吗?

Batch file 如何使用FOR循环对不';你不能满足条件吗?,batch-file,Batch File,我正在制作一个简单的批处理脚本来处理一大组文件并删除所有我不想要的文件。我想要大约10%的文件,它们的名字中都有特定的标签,比如说它们包含apple、orange或pear。由于需要删除的文件太多,因此为构建一个循环将非常耗时,例如: @echo off pause for /R %%i in ([the list of names of the files I don't want]) do del %%i pause 因此,我想知道是否有可能对其进行编码,从而删除所有名称不包含apple、

我正在制作一个简单的批处理脚本来处理一大组文件并删除所有我不想要的文件。我想要大约10%的文件,它们的名字中都有特定的标签,比如说它们包含
apple
orange
pear
。由于需要删除的文件太多,因此为构建一个循环将非常耗时,例如:

@echo off
pause
for /R %%i in ([the list of names of the files I don't want]) do del %%i
pause
因此,我想知道是否有可能对其进行编码,从而删除所有名称不包含
apple
orange
pear
的文件

换句话说,应删除所有文件,但文件名中不包含这三个单词中的任何一个


我使用FOR循环是因为文件嵌套在许多子目录中,我希望在删除不需要的文件后保留此结构。

您可以使用此批处理文件,该批处理文件只包含(或多或少)一个命令行:

@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"
由于命令行末尾的
del
之前的命令ECHO,此批处理代码不会真正删除文件。在命令提示符窗口中运行此批处理文件,当前目录是要删除不需要的文件并验证输出的目录树的根目录。然后删除ECHO,并再次运行批处理文件

由于当前目录中的
/S
,命令DIR只搜索文件,因为
/A-D
(不是目录属性)将通配符模式
*
与裸格式的输出匹配,因为
/B
意味着输出仅包含所有找到的具有完整路径的文件的名称

DIR如果找不到任何文件,则输出错误消息以处理STDERR。通过使用
2>NUL
将此错误消息重定向到设备NUL,可以抑制此错误消息。在Windows命令解释器解析的命令行时,重定向运算符必须在此处转义,插入符号^首先被解释为文字字符

处理STDOUTDIR的输出通过
管道传输到标准控制台应用程序FINDSTR,该应用程序在所有行中搜索不区分大小写的正则表达式字符串,因为
/I
是由
/C:
指定的
/R
。重定向操作符
|
必须在此处使用
^
进行转义

FINDSTR不支持OR表达式,就像其他支持正则表达式的应用程序一样。但是可以像这里那样指定多个搜索字符串,这些字符串都应用于文本的每一行,以逐个处理,直到出现正匹配或不再有搜索字符串为止。这是一个经典或经典的例子

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

  • word
    。。。必须找到
    word
    (不区分大小写)
  • [^\\]*
    。。。查找0个或多个不是反斜杠的字符
  • $
    。。。必须在行尾找到匹配的字符串
正则表达式仅用于文件名包含
apple
orange
pear
的行获得正匹配,而不是文件路径

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

FOR命令FINDSTR处理作为输出DIR的负过滤器的FINDSTR输出的每一行,并分别为每一行运行DEL命令ECHO,而不会因为
delims=
而将该行拆分为空格/tab分隔的字符串

就这样

如果批处理文件存储在由命令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"
上面的批处理代码在命令
del
之前没有ECHO,因此在执行时确实会删除文件

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

  • attrib/?
  • del/?
  • dir/?
  • echo/?
  • findstr/?
  • 获取/?
  • rem/?

另请阅读Microsoft关于的文章,了解有关
|
2>nul
的说明。您可以使用此批处理文件,该批处理文件只包含(或多或少)一个命令行:

@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"
由于命令行末尾的
del
之前的命令ECHO,此批处理代码不会真正删除文件。在命令提示符窗口中运行此批处理文件,当前目录是要删除不需要的文件并验证输出的目录树的根目录。然后删除ECHO,并再次运行批处理文件

由于当前目录中的
/S
,命令DIR只搜索文件,因为
/A-D
(不是目录属性)将通配符模式
*
与裸格式的输出进行匹配,因为
/B
意味着输出仅包含所有找到的文件的名称以及完整的p