我正在制作一个简单的批处理脚本来处理大量文件并删除所有我不想要的文件。我想要大约10%的文件,并且它们的名称中都包含某些标记,假设它们包含apple
,orange
或pear
。由于我想要删除的文件太多,构建 FOR 循环会非常耗时,例如:
@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
的文件?
换句话说,应该删除所有文件,而不是在其名称中包含这3个单词中的一个。
我正在使用FOR循环,因为这些文件嵌套在很多子目录中,我希望在删除不需要的文件后保留这个结构。
答案 0 :(得分:0)
您可以使用包含(或多或少)一个命令行的批处理文件:
@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 并再次运行批处理文件。
命令 DIR 由于当前目录中的/S
而仅搜索文件的所有子目录,因为/A-D
(非目录属性)与通配符模式{{1}匹配因为*
而输出为裸格式,这意味着输出只包含所有找到的具有完整路径的文件的名称。
DIR 会输出错误消息以处理 STDERR 。通过使用/B
将其重定向到设备 NUL 来抑制此错误消息。必须使用插入符2>nul
对重定向运算符>
进行转义,以便在Windows命令解释器解析 FOR 命令行时首先将其解释为文字字符。
用于处理 STDOUT 的 DIR 的输出通过^
传送到标准控制台应用程序 FINDSTR ,在所有行中搜索由于|
因/I
指定/R
而导致正则表达式字符串为/C:
,因此不敏感。必须使用|
将重定向操作符^
转义到此处。
FINDSTR 不支持OR表达式,就像具有正则表达式支持的其他应用程序一样。但是可以在此处指定多个搜索字符串,这些搜索字符串全部应用于文本的每一行以一个接一个地处理,直到发生肯定匹配或没有更多搜索字符串。这是一个经典的OR。
正则表达式word[^\\]*$
表示:
word
...必须找到word
(不区分大小写)。[^\\]*
...找到0个或多个不是反斜杠的字符。$
...必须在行尾找到匹配的字符串。正则表达式用于仅为文件名包含apple
或orange
或pear
的行获得肯定匹配,但不是文件路径。
但还有一个 FINDSTR 选项:/V
。此选项将结果输出反转为处理 STDOUT 。因此输出是3个正则表达式中 none 产生正匹配的行。
命令 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"
上面的批处理代码在命令del
之前没有 ECHO ,因此确实删除了执行中的文件。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
attrib /?
del /?
dir /?
echo /?
findstr /?
for /?
rem /?
另请阅读Microsoft有关Using Command Redirection Operators的文章,了解|
和2>nul
的解释。