Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file CMD可从多个文件夹路径中删除包含文件的特定文件夹_Batch File_Cmd_Command Line Interface_Batch Processing_Command Prompt - Fatal编程技术网

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

Batch file CMD可从多个文件夹路径中删除包含文件的特定文件夹,batch-file,cmd,command-line-interface,batch-processing,command-prompt,Batch File,Cmd,Command Line Interface,Batch Processing,Command Prompt,我需要一个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

我需要一个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经验,但没有批量编程经验,我没有太多时间,支持团队也不在场。[需要帮助]。首先,正如Microsoft文档所解释的,Windows上的目录分隔符是
\
,而不是Linux/Mac上的
/
<代码>/用于Windows上的选项,您可以在代码上看到,例如在
/Q
上。因此,在将来的文件/文件夹路径中使用
\
。访问内核函数的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
FORwith option
/F
在一个单独的命令进程中运行,该命令进程从
cmd.exe/C
开始(更准确地说是
%ComSpec%/C
)在
的后台命令行中运行<代码>“
在这里:

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"
命令DIR输出以处理STDOUT

  • 由于选项
    /B
  • 由于选项
    /AD
    (属性目录),所以仅使用目录
  • 与通配符模式匹配的目录名
    log*
  • 在指定的目录中
    C:\Program Files\product\plugins\plugin\u Path
  • 由于选项
    /S
  • 使用完整路径也是因为选项
    /S
可能是DIR找不到任何符合这些条件的文件系统条目。在这种情况下,DIR会输出一条错误消息来处理STDERR。使用
2>nul
将此错误输出重定向到设备nul,以抑制它

DIR的标准输出通过
|
重定向,以处理运行的FINDSTRSTDIN

  • 因为选项
    /I
    不区分大小写
  • 使用选项
    /R
  • 用于字符串
    \log
    \log archive
    (空格解释为或)
  • 由于选项
    /E
    ,必须在行尾找到
所有符合这些搜索条件的行都由FINDSTR输出,以处理后台命令过程的STDOUT。使用FINDSTRDIR的输出进行过滤是必要的,以避免删除名为
LogToKeep
的目录,该目录也由DIR查找和输出

阅读Microsoft关于的文章,了解有关
2>nul
|
的解释。当Windows命令解释器在执行
FOR命令之前处理此命令行时,必须使用上的插入符号^对进行转义,以将命令行解释为文字字符单独的命令进程在后台启动

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

FORDIR输出的每个目录执行FINDSTR全路径过滤命令RD以安静地删除目录,因为选项
/Q
,因为
/S
而删除所有文件和子目录

由于缺少NTFS权限,或者要删除的目录或其子目录之一是正在运行的进程的当前目录,或者要删除的目录中的文件当前由正在运行的进程以拒绝在打开时删除该文件的方式打开,因此删除该目录可能会失败,或者要删除的目录不再存在,因为它以前已在FOR循环中被删除。错误
 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\*"
 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\*"