繁体   English   中英

FORFILES:仅在RELPATH包含子字符串时删除文件

[英]FORFILES: Only delete file if RELPATH contains substring

在另一个主题中,我找到了以下代码片段来检查字符串是否包含子字符串。

if not x%str1:bcd=%==x%str1% echo It contains bcd

现在,我试图在我的FORFILES方法中实现这一点。 FORFILES应该删除包含子字符串“ IMG”的子文件夹中的XML文件。 我将代码修改如下:

set loglocation=C:\Tools\PurgeOldFiles\log\DELETEOLD_XML_IMG.txt
set olderthan=30
set source=X:\Test
set extension=XML

FORFILES -p%source% -s -m*.%extension% -d-%olderthan% -c"CMD /C if not x@RELPATH:img=%==x@RELPATH DEL @PATH\@FILE /q & echo @PATH\@FILE deleted." >> %loglocation%

它不会删除IMG子文件夹中的旧(超过30天)XML文件。

我猜我在“ x @ RELPATH:img =%== x @ RELPATH”中有某种(语法)错误。

您将需要一个临时环境变量(例如VAR )和延迟扩展来完成该任务。


首先,让我们构建需要在forfiles循环中执行的代码:

if @isdir==FALSE (
    set VAR=@relpath
    if not #!VAR:%search%=!==#!VAR! (
        del /Q @path
        echo @path deleted.
    )
)

这将执行以下步骤:

  • 检查匹配项是否为文件,否则跳过其余部分;
  • @relpath的值分配给变量VAR 注意@relpath扩展为用""括起来的相对路径;
  • 检查扩展后的相对路径是否至少包含一个搜索字符串实例,否则不跳过其余实例; 请注意,搜索是以不区分大小写的方式进行的;
  • 删除匹配路径,返回相关日志信息; @path已经包含文件名和扩展名,因此您不需要@file

现在,让我们将以上代码作为一行编写,然后将其与forfiles放在一起:

set "loglocation=C:\Tools\PurgeOldFiles\log\DELETEOLD_XML_IMG.txt"
set "olderthan=30"
set "source=X:\Test"
set "extension=XML"
set "search=img"

forfiles /S /P "%source%" /M "*.%extension%" /D -%olderthan% /C "cmd /V:ON /C 0x22if @isdir==FALSE ((set VAR=@relpath) & if not #!VAR:%search%=!==#!VAR! (del /Q @path & echo @path deleted.))0x22" >> "%loglocation%"

cmd/V开关启用延迟扩展; !VAR! 语法利用了它(与%VAR%相对)。 输入cmd /? 有关更多信息。


笔记:

搜索img子字符串不关心在哪里(在路径中的哪个级别)找到匹配项,也不会检测发生了多少匹配项。

请注意, forfiles /S开关使它可以递归枚举给定目录。

您不能直接在FORFILES变量上进行查找/替换。 我将使用带有正则表达式的FINDSTR来确定文件夹路径是否包含IMG。 您可以将输出重定向到NUL并仅在使用&&找到时有条件地执行命令。

其他事宜:

  • 您只需在DEL和log语句中使用@PATH-它包含完整路径,包括文件名。
  • 由于没有通配符,因此不需要DEL /Q选项。
  • 如果DEL成功,则仅应回显删除消息。 但是DEL不会设置错误级别或激活|| 如果失败,即使它向stderr打印一条错误消息。 您可以将DEL stderr重定向到stdout并通过管道传递到FINDSTR以确定是否存在错误消息,然后使用|| &&采取适当的措施。

如果IMG在路径中的任何位置,或者仅在父文件夹中,则不清楚是否要删除文件。

如果IMG出现在文件夹路径中的任何位置,则以下删除文件:

set loglocation=C:\Tools\PurgeOldFiles\log\DELETEOLD_XML_IMG.txt
set olderthan=30
set source=X:\Test
set extension=XML

forfiles /p "%source%" /s /m "*.%extension%" /d -%olderthan% /c "cmd /c echo @RELPATH|findstr /i IMG.*[\\] >nul &&(del @PATH 2>&1|findstr 0x22^0x22>nul&&echo unable to delete @PATH||echo deleted @PATH)"  >>"%loglocation%"

更为复杂的正则表达式将删除限制为仅在IMG出现在父文件夹中时

set loglocation=C:\Tools\PurgeOldFiles\log\DELETEOLD_XML_IMG.txt
set olderthan=30
set source=X:\Test
set extension=XML

forfiles /p "%source%" /s /m "*.%extension%" /d -%olderthan% /c "cmd /c echo @RELPATH|findstr /i 0x22IMG[^\\]*[\\][^\\]*$0x22 >nul &&(del @PATH 2>&1|findstr 0x22^0x22>nul&&echo unable to delete @PATH||echo deleted @PATH)"  >>"%loglocation%"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM