FORFILES:只有在RELPATH包含子字符串时才删除文件

时间:2015-11-06 15:27:43

标签: windows batch-file cmd substring

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

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天)。

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

2 个答案:

答案 0 :(得分:1)

您需要一个临时环境变量,比如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%"

/V的{​​{1}}开关可以延迟扩展; cmd语法使用它(与!VAR!相对)。输入%VAR%可获取更多相关信息。

备注:

搜索cmd /?子字符串并不关心找到匹配的位置(路径中的哪个级别),也不会检测发生了多少匹配。

请注意img的开关/S使其以递归方式枚举给定目录。

答案 1 :(得分:1)

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

其他问题:

  • 您的DEL和日志语句中只需要@PATH - 它包含完整路径,包括文件名。
  • 由于没有通配符,因此不需要DEL /Q选项。
  • 如果DEL成功,您应该只回显删除消息。但DEL如果失败则不设置errorlevel或激活||,即使它向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%"