在另一个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”中有某种(语法)错误。
答案 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,并仅在使用&&
找到时有条件地执行命令。
其他问题:
/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%"