CMD 删除包含多个文件夹路径中的文件的特定文件夹



我需要一个CMD批处理文件来删除所有日志文件。 我的公司为他们的产品制作插件,路径如下:

C:/Program Files/product/../plugins/../plugin_Path/pluginOne/audit/log
C:/Program Files/product/../plugins/../plugin_Path/pluginOne/audit/log-archive
C:/Program Files/product/../Root/plugins/../plugin_Path/pluginTwo/audit/log
C:/Program Files/product/../Root/plugins/../plugin_Path/pluginTwo/audit/log-archive

现在我需要删除所有日志和日志存档文件夹及其包含的内容。

目前我写了一个这样的samll程序:

@echo off
color 02
for %%A in (
"C:/Program Files/product/plugins/plugin_Path/pluginOne/audit/log"
"C:/Program Files/product/plugins/plugin_Path/pluginOne/audit/log-archive"
"C:/Program Files/product/plugins/plugin_Path/pluginTwo/audit/log"
"C:/Program Files/product/plugins/plugin_Path/pluginTwo/audit/log-archive"
) do (
del /Q %%A
echo Deleted %%A
)
echo All files deleted
pause
echo Program ended

但是在这里我需要手动插入所有日志路径。 我正在寻找一种解决方案,我可以指向父文件夹(例如程序文件/公司),它可以遍历其中的所有文件,并将删除所有日志和日志存档文件夹及其包含的内容。 我是一个QA人员,有很好的QA经验,但没有批量编程的经验,我没有太多时间,支持团队也不在场。[需要帮助]。存在超过 1K 个日志文件

首先,正如Microsoft文档命名文件、路径和命名空间所解释的那样,Windows 上的目录分隔符是的,而不是像 Linux/Mac 上那样//在 Windows 上用于选项,正如您在代码中看到的那样,例如在/Q.因此,在将来的文件/文件夹路径中使用。访问内核函数的 Windows 文件系统在访问文件系统之前会自动将所有正斜杠替换为反斜杠,但根据自动纠错编写代码从来都不是一个好主意。

删除指定文件夹中名称为loglog-archive的所有文件夹及其所有子文件夹的任务可以使用单个命令行完成。

@for /F "delims=" %%I in ('dir "%ProgramFiles%productpluginsplugin_Pathlog*" /AD /B /S 2^>nul ^| %SystemRoot%System32findstr.exe /E /I /R "\log \log-archive"') do @rd /Q /S "%%I" 2>nul

带有选项的 FOR/F在单独的命令进程中运行,该进程以cmd.exe /C(更准确地说是%ComSpec% /C)在后台的命令行中运行'...'在这里:

dir "C:Program Filesproductpluginsplugin_Pathlog*" /AD /B /S 2>nul | C:WindowsSystem32findstr.exe /E /I /R "\log \log-archive"

命令 DIR输出以处理标准输出

  • 由于选项/B,采用裸格式
  • 只是目录,因为选项/AD(属性目录)
  • 与通配符模式log*匹配的目录名称
  • 在指定的目录C:Program Filesproductpluginsplugin_Path
  • 及其所有子目录,因为选项/S
  • 使用完整路径也因为选项/S.

可能是DIR找不到任何符合这些条件的文件系统条目。在这种情况下,DIR会输出一条错误消息来处理STDERR。此错误输出通过2>nul重定向到设备NUL以抑制它。

DIR的标准输出使用|重定向以处理运行FINDSTRSTDIN

  • 由于选项/I不区分大小写
  • 使用选项/R显式请求的正则表达式查找
  • 对于字符串loglog-archive(空格解释为 OR)
  • 由于选项/E,必须在行尾找到。

与这些搜索条件匹配的所有行都由FINDSTR输出,以处理后台命令进程的STDOUT。使用FINDSTR对 DIR 输出进行这种过滤是必要的,以避免删除例如由DIR找到和输出LogToKeep命名的目录。

阅读有关使用命令重定向运算符的Microsoft文章,了解2>nul|的说明。当 Windows 命令解释器在执行命令 FOR 之前处理此命令行时,重定向运算符>|必须使用插入字符^转义,以便在执行命令FOR之前将其解释为文字字符,该命令使用在后台启动的单独命令进程执行嵌入式命令行。

FORwith 选项/F捕获输出以处理已启动命令进程的STDOUT,并在启动cmd.exe终止自身后逐行处理此输出。空行始终被FOR忽略,此处不会出现空行。默认情况下,以分号开头的行也会被忽略,因为eol=;行尾选项的默认定义。但是,完全限定的文件夹路径在开头不能包含分号,因为文件夹路径以驱动器号开头,如果是 UNC 路径,则以反斜杠开头。因此,在这种情况下可以保留默认的行尾选项。默认情况下,FOR将使用普通空格和水平制表符作为字符串分隔符将每行拆分为子字符串,并且只将第一个空格/制表符分隔的字符串分配给指定的循环变量。这里不需要这种分行行为,因为文件夹路径肯定包含一个空格字符,并且需要整个文件夹路径,而不仅仅是第一个空格之前的字符串。因此,delims=用于指定禁用分行行为的空分隔符列表。

FOR通过DIR通过FINDSTR过滤器(具有完整路径命令RD)对每个目录输出执行,以安静地删除目录,因为选项/Q以及由于/S而包含所有文件和子目录。

目录的删除可能会因为缺少 NTFS 权限而失败,或者要删除的目录或其子目录之一是正在运行的进程的当前目录,或者要删除的目录中的文件当前由正在运行的进程打开,打开时拒绝删除该文件, 或者要删除的目录不再存在,因为它之前已经在FOR循环中删除了。在这种情况下,命令RD输出的用于处理STDERR的错误消息将重定向到设备NUL以禁止显示它。

请注意,命令RD删除所有loglog-archives目录,而不仅仅是这些目录中的文件和子目录。从您的问题中不清楚批处理文件究竟应该删除什么。

当然,也可以通过del /A /F /Q "%%I*"替换rd /Q /S "%%I",以安静地删除所有文件,包括隐藏和只读文件,这些文件都位于分配有完整路径的目录中

,以循环变量I

@命令FOR和命令RD只是在 Windows 命令处理器执行之前抑制这些命令的输出cmd.exe。如果在包含@echo off之前的批处理文件中使用此单个命令行,则不需要这两个@

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

  • del /?
  • dir /?
  • findstr /?
  • for /?
  • rd /?

如果要删除日志和日志存档目录的内容。这意味着最简单的解决方案可能是 FORFILES。

这将删除在"C:\Program Files\product\plugins"的任何子文件夹中找到的日志和日志存档目录下的所有文件。文件夹必须准确命名loglog-archive。它不会删除目录。

FORFILES /P "C:Program Filesproductplugins" /M log /C "cmd /c if @isdir==TRUE DEL /s /q @path*"
FORFILES /P "C:Program Filesproductplugins" /M log-archive /C "cmd /c if @isdir==TRUE DEL /s /q @path*"

您还可以添加/D开关,以仅在适用文件超过特定天数时删除这些文件。这将删除"C:\Program Files\product\plugins"下超过 90 天的所有日志和日志存档文件:

FORFILES /D -90 /P "C:Program Filesproductplugins" /M log /C "cmd /c if @isdir==TRUE DEL /s /q @path*"
FORFILES /D -90 /P "C:Program Filesproductplugins" /M log-archive /C "cmd /c if @isdir==TRUE DEL /s /q @path*"

最新更新