我想从文件夹中删除文件,如果没有要删除的文件,则应忽略错误并捕获所有其他错误。以下是我正在使用的代码。
FOR /F "tokens=*" %%a IN ('FORFILES /P "%%G" /D -3 /C "cmd /c DEL @path" 2^>^&1 ^| FINDSTR ERROR') DO SET _CmdResult=%%a
IF "%_CmdResult%" == "ERROR: No files found with the specified search criteria." (
SET errorlevel=0
) ELSE (
SET errorlevel=1
)
IF "%_CmdResult%" == "NONE" SET errorlevel=0
IF NOT %errorlevel% EQU 0 (
goto delete_fail )
以下是我在代码上运行时在命令提示符下看到的内容。
FOR /F "tokens=*" %a IN ('FORFILES /P "%G" /D -2 /C "cmd /c DEL @path" | FINDSTR ERROR') DO SET _CmdResult=%a
IF "NONE" == "ERROR: No files found with the specified search criteria." <<<<< _CmdResult is still "NONE"
(
SET errorlevel=0
) ELSE (
SET errorlevel=1 )
IF "NONE" == "NONE" SET errorlevel=0
IF NOT 0 EQU 0 (goto delete_fail )
根据日志,我发现当没有要删除的文件时,错误字符串没有保存到_CmdResult中。任何人都可以让我知道我错过了什么,
答案 0 :(得分:1)
FOR /F "tokens=*" %%a IN ('FORFILES /P "%%G" /D -3 /C "cmd /c DEL @path" 2^>^&1 ^| FINDSTR ERROR') DO SET _CmdResult=%%a
%% G表示此行作为外部for循环的一部分执行。如果该循环包含显示的其余代码,那么您有延迟扩展的问题。当执行到达一个块(括号之间的代码)时,所有行在执行之前被解析,并且变量被加入的行被更改,用变量的引用替换它在解析块时包含的值。您需要启用延迟扩展而不是%var%
sintax,请使用!var!
sintax。
IF "%_CmdResult%" == "ERROR: No files found with the specified search criteria." (
SET errorlevel=0
) ELSE (
SET errorlevel=1
)
IF "%_CmdResult%" == "NONE" SET errorlevel=0
简而言之,不要这样做。不要将errorlevel变量设置为任何值。它的值是动态的,由red提供时由cmd提供,但是,如果显式指定了值,则无法读取动态值。 %errorlevel%将返回您为其设置的值。如果将其设置为0,则只能获得此值,而不会成功执行命令失败。它将是0。
如果您需要重置错误级别值,请使用vol > nul
答案 1 :(得分:0)
在上面的代码之前使用此命令并在errorlevel上分支
FORFILES /P "%%G" /D -3 2>&1 |find "ERROR:" >nul
if errorlevel 1 goto :nofiles
FORFILES /P "%%G" /D -3 /C "cmd /c DEL @path"
答案 2 :(得分:0)
我尝试使用下面的代码,它按预期工作。早些时候我错过了粘贴外部for循环并抱歉。我已经启用了延迟扩展,并且在我的帮助下,我能够实现我的要求。
SET del_op=NONE
rem ###################################
rem - Loop thru all archives to delete
rem ###################################
FOR %%G in (%arc_log%,%arc_in%,%arc_out%) DO (
ECHO Deleting files from "%%G" older than %var% days >> %log_path%\%log_file% 2>>&1
FOR /F "tokens=*" %%a IN ('FORFILES /P "%%G" /D -%var% /C "cmd /c DEL @path" 2^>^&1 ^| FINDSTR ERROR') DO SET del_op=%%a
rem ####################
rem - suppressing error
rem ####################
IF "!del_op!" == "ERROR: No files found with the specified search criteria." (
ECHO suppressed "!del_op!" >> %log_path%\%log_file% 2>>&1
SET err_lv=0
) ELSE (
SET err_lv=1
)
IF "!del_op!" == "NONE" SET err_lv=0
IF !err_lv! EQU 1 (
goto delete_fail )
ECHO Successfully deleted old files from "%%G" >> %log_path%\%log_file% 2>>&1
)
感谢大家的建议。