forfiles错误抑制无法按预期工作

时间:2013-12-20 18:43:26

标签: batch-file error-suppression

我想从文件夹中删除文件,如果没有要删除的文件,则应忽略错误并捕获所有其他错误。以下是我正在使用的代码。

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中。任何人都可以让我知道我错过了什么,

3 个答案:

答案 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
)

感谢大家的建议。