[英]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并仅在使用&&
找到时有条件地执行命令。
其他事宜:
/Q
选项。 ||
如果失败,即使它向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.