我需要在批处理文件下面的所有目录中搜索名为History
的所有文件夹,然后删除这些目录中的所有* .zip文件。
我有一个批处理文件,该文件当前使用以下代码删除带有2个数字和一个$符号的所有文件:
For /F "delims=" %%A in (
'Dir /B/S "*,*" ^| findstr ",[0-9][0-9]*$" '
) Do Del "%%A"
但是只有History
文件夹中的所有zip文件呢?
答案 0 :(得分:0)
可以在批处理文件中使用以下命令行来删除在当前目录及其子目录中找到的名称为History
的所有目录中的所有* .zip文件:
@for /F "delims=" %%I in ('dir History /AD /B /S 2^>nul') do @del /A /F /Q "%%I\*.zip" 2>nul
命令 FOR 在后台使用%ComSpec% /c
和在两个'
之间指定的命令行启动了另一个命令过程,这导致在Windows上执行以下命令行被安装在C:\Windows
中:
C:\Windows\System32\cmd.exe /c dir History /AD /B /S 2>nul
后台Windows命令进程运行内部命令 DIR ,其中
/S
,在当前目录及其所有子目录中搜索/AD
(属性目录)而用于目录History
和/B
逐行以裸格式输出找到的目录,这意味着由于选项/S
来处理 STDOUT 后台命令过程。完全限定的目录名称由 DIR 输出,即使包含空格或这些字符之一&()[]{}^=;!'+,`~
,也不需要用双引号引起来,因为这些字符要求使用全限定名前后的双引号将其作为参数字符串传递给命令或应用程序。
DIR 可能找不到文件系统中符合搜索条件的任何目录。在这种情况下, DIR 输出以处理后台命令的 STDERR 时,将出现一条错误消息,这对于读者来说有点令人困惑,因为它包含单词file
而不是单词directory
或folder
。通过将其重定向到设备 NUL ,可以抑制 DIR 在目录History
上找不到此错误消息。
阅读有关Using command redirection operators的Microsoft文章,以获取2>nul
的解释。当Windows命令解释器在执行命令之前处理此命令行时,重定向操作符>
必须在 FOR 命令行上使用脱字符号^
进行转义,才能被解释为文字字符。 FOR ,它将在后台启动的单独命令进程中执行嵌入式dir
命令行。
FOR 和选项/F
处理捕获的输出,这些捕获的输出在启动cmd.exe
自身终止后逐行处理后台命令处理过程的 STDOUT 。 FOR 重定向用于处理后台命令过程的 STDERR 的文本输出,以处理当前正在处理批处理文件的命令过程的 STDERR 运行没有2^>nul
的批处理文件时,将在控制台窗口中显示。
空行在处理捕获的输出时始终被 FOR 忽略。但是在这种情况下没有空行,因为 DIR 不输出任何内容,或者找到的目录逐行具有完整路径,并且之间没有空行。
带有选项/F
的 FOR 将默认使用普通空格和水平制表符作为字符串定界符将一行拆分为子字符串,并仅将第一个空格/制表符分隔的字符串分配给循环变量I
。这里不需要这种字符串拆分行为,因为到History
目录的路径可能包含一个或多个空格。因此,delims=
指定了一个空的定界符列表,它们完全禁用了行分割行为,并且分配给循环变量I
是由 DIR 输出的完整合格目录名称。>
如果选项/F
是行尾选项的默认设置,则使用选项eol=;
的
FOR 也会忽略当前行,如果使用分号分隔行后第一个子字符串开始。可以保留此默认值,因为完整的合格目录名称以驱动器号或反斜杠(UNC路径)开头,因此绝对绝不能以分号开头。因此,每个由 DIR 输出的具有完整路径的目录名称都由 FOR 处理,并且一个接一个地分配给变量I
。
对于分配给循环变量I
的每个完整合格目录名,均执行命令 DEL ,切勿用双引号将其删除,以删除与通配符模式*.zip
匹配的所有文件。目录。与字符串\*.zip
串联的完整合格目录名称必须用双引号引起来,才能正确传递给命令 DEL ,其中包含空格或Windows命令处理器特殊解释的其他字符。>
DEL 选项/A
用于覆盖默认/A-H
,以删除具有隐藏属性集的ZIP文件,否则 DEL 。
DEL 选项/F
用于强制删除只读ZIP文件。
DEL 选项/Q
用于静默删除ZIP文件,而不会提示用户进行确认。
命令 DEL 可能无法删除ZIP文件,例如,如果要删除的ZIP文件当前已由另一个进程打开,或者用户没有必需的权限来删除ZIP文件,例如特定目录。在这种情况下,命令 DEL 将输出一条错误消息以处理 STDERR 。通过将 DEL 输出的此类错误消息重定向到设备 NUL 。
命令行中的两个@
仅在执行之前由Windows命令处理器解析后禁用 FOR 命令行和 DEL 命令行的输出在每次循环迭代之前执行。如果批处理文件包含顶部@
,则在执行批处理文件中的所有命令行之前,在解析之后禁用命令行输出,就不需要两个@echo off
。
在Windows command prompt窗口中使用参数/?
运行三个已使用命令时,将输出帮助,即执行for /?
和dir /?
和del /?
另请参阅:How does the Windows Command Interpreter (CMD.EXE) parse scripts?