我需要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
但是在这里,我需要 手动 插入所有日志路径。 我正在寻找一种解决方案,可以指向父文件夹(例如Program Files / Company),并且可以遍历其中的所有文件,并删除所有包含其内容的日志和日志归档文件夹。 我是质量检查人员,具有良好的质量检查经验,但没有批处理编程经验,并且我没有太多时间,并且没有支持团队。 [需要帮助] 。 存在超过1K个日志文件 。
答案 0 :(得分:0)
首先,如Microsoft文章Naming Files, Paths, and Namespaces所述,Windows上的目录分隔符为\
,而不是Linux / Mac上的/
。在Windows上,/
用于提供选项,例如您在代码中看到的/Q
。因此,以后在{/ {1}}中使用文件/文件夹路径。 Windows文件系统访问内核函数会在访问文件系统之前自动将所有正斜杠替换为反斜杠,但是根据自动纠错方式编写代码绝不是一个好主意。
删除指定文件夹中名称为\
或log
的所有文件夹及其所有子文件夹的任务可以通过一个命令行完成。
log-archive
带有选项@for /F "delims=" %%I in ('dir "%ProgramFiles%\product\plugins\plugin_Path\log*" /AD /B /S 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /I /R "\\log \\log-archive"') do @rd /Q /S "%%I" 2>nul
的 FOR 在{{1}中的后台命令行中以/F
(更精确地说,以cmd.exe /C
开头)在单独的命令进程中运行}} ... %ComSpec% /C
在这里:
'
命令 DIR 输出以处理 STDOUT
'
而以裸格式显示dir "C:\Program Files\product\plugins\plugin_Path\log*" /AD /B /S 2>nul | C:\Windows\System32\findstr.exe /E /I /R "\\log \\log-archive"
(属性目录)而只是目录/B
匹配的目录名称/AD
log*
C:\Program Files\product\plugins\plugin_Path
。 DIR 可能找不到符合这些条件的任何文件系统条目。在这种情况下, DIR 会输出一条错误消息来处理 STDERR 。此错误输出将通过/S
重定向到设备 NUL 进行抑制。
DIR 的标准输出通过/S
重定向,以处理运行的 FINDSTR 的 STDIN 。
2>nul
不区分大小写|
明确请求的正则表达式查找/I
或 /R
(空格解释为OR)\log
而必须在行末找到。所有符合这些搜索条件的行均由 FINDSTR 输出,以处理后台命令过程的 STDOUT 。必须使用 FINDSTR 对 DIR 的输出进行过滤,以避免删除同样由 DIR找到并输出的名为\log-archive
的目录。 。
阅读有关Using Command Redirection Operators的Microsoft文章,以获取/E
和LogToKeep
的解释。重定向操作符2>nul
和|
必须用 FOR 命令行上的脱字符号>
进行转义,以在Windows命令解释器处理此命令行时将其解释为原义字符。在执行命令 FOR 之前,该命令将在后台启动的单独命令进程中执行嵌入式命令行。
|
的 FOR 捕获输出以处理已启动命令进程的 STDOUT ,并在启动^
自身终止后逐行处理此输出。空行始终被 FOR 忽略,此处不会出现。默认情况下,也将忽略以分号开头的行,因为/F
是行尾选项的默认定义。但是,完整的合格文件夹路径开头不能包含分号,因为在UNC路径下,文件夹路径以驱动器号或反斜杠开头。因此,在这种情况下可以保留默认的行尾选项。 FOR 默认情况下会使用正常空格和水平制表符作为字符串定界符将每一行拆分为子字符串,并将仅第一个空格/制表符分隔的字符串分配给指定的循环变量。这里不需要这种行拆分行为,因为文件夹路径肯定包含空格字符,并且需要整个文件夹路径,而不仅仅是字符串到第一个空格。因此,cmd.exe
用于指定一个空的定界符列表,以禁止行分割行为。
FOR 对 DIR 输出的每个目录执行,并通过 FINDSTR 过滤器以完整路径传递命令 RD 删除由于选项eol=;
导致目录安静,而由于delims=
导致所有文件和子目录进入。
由于缺少NTFS权限,或者要删除的目录或其子目录之一是正在运行的进程的当前目录,或者正在删除的目录中的文件当前正在运行中,该目录的删除可能会失败。一种在打开文件时拒绝删除文件的方式,或者由于在 FOR 循环中之前已删除了该目录而不再存在要删除的目录。在这种情况下,命令 RD 输出的用于处理 STDERR 的错误消息将重定向到设备 NUL 以对其进行抑制。
请注意,命令 RD 会删除所有/Q
和/S
目录,而不仅仅是这些目录中的文件和子目录。从您的问题尚不清楚,批处理文件应删除哪些内容。
当然也可以将log
替换为log-archives
,从而在分配了循环变量rd /Q /S "%%I"
完整路径的目录中安静地删除所有文件,包括隐藏文件和只读文件。
del /A /F /Q "%%I\*"
的情况下,才禁止这些命令的输出,然后再由Windows命令处理器I
执行。如果在包含@
之前的批处理文件中使用了此单个命令行,则不需要两个cmd.exe
。
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。
@
@echo off
del /?
dir /?
findstr /?
答案 1 :(得分:0)
如果要删除日志和日志归档目录的内容。这意味着最简单的解决方案可能是FORFILES。
这将删除在“ C:\ Program Files \ product \ plugins”的任何子文件夹中找到的日志和日志归档目录下的所有文件。文件夹必须精确命名为log
或log-archive
。它不会删除目录。
FORFILES /P "C:\Program Files\product\plugins" /M log /C "cmd /c if @isdir==TRUE DEL /s /q @path\*"
FORFILES /P "C:\Program Files\product\plugins" /M log-archive /C "cmd /c if @isdir==TRUE DEL /s /q @path\*"
您还可以添加/D
开关以仅删除适用的文件,如果它们早于特定的天数。这将删除超过90天的“ C:\ Program Files \ product \ plugins”下的所有日志和日志归档文件:
FORFILES /D -90 /P "C:\Program Files\product\plugins" /M log /C "cmd /c if @isdir==TRUE DEL /s /q @path\*"
FORFILES /D -90 /P "C:\Program Files\product\plugins" /M log-archive /C "cmd /c if @isdir==TRUE DEL /s /q @path\*"