如何使用批处理命令处理错误?

How to handle errors using batch commands?

我正在尝试使用以下命令删除超过 14 天的文件:forfiles /P "Path\To\Files" /S /M *.txt /D -14 /C "cmd /c del @path"

这是我在尝试删除文件时遇到的错误:ERROR: No files found with the specified search criteria.

有没有办法处理或抑制这个错误?原因是因为我在 jenkins 上使用这个命令并且构建因为这个命令而失败。谢谢

我也查看了 ERRORLEVEL 并使用了以下代码,但它仍然给我错误:

forfiles /P "Path\To\Files" /S /M *.txt /D -14 /C "cmd /c del @path" | find "ERROR" >nul2>nul
if not ERRORLEVEL 1 (
echo. Uh oh, something bad happened
exit /b 1
)

您可以排除此错误,保留所有其他 ERROR 消息:

forfiles /P "Path\To\Files" /S /M *.txt /D -14 /C "cmd /c del @path" 2>&1|find /v "ERROR: No files found with the specified search criteria." | find "ERROR" >nul2>nul

EDIT 只有 STDOUT 通过管道传输到 find,因此错误消息一直显示在屏幕上。编辑为将 STDERR 也写入 STDOUT,以便 find 可以处理它。

您可以创建一个转到标签来检查错误。只需在任何需要检查错误的行之后放置 call:checkerrors

forfiles /P "Path\To\Files" /S /M *.txt /D -14 /C "cmd /c del @path"
call:checkerrors

goto :eof

:checkerrors
if %errorlevel% neq 0 (
    echo. Uh oh, something bad happened
    exit /b 0
)

goto :eof

如果 ERROREVEL 不为 0,则构建失败。

forfiles /P "Path\To\Files" /S /M *.txt /D -14 /C "cmd /c del @path" | find "ERROR" >nul2>nul
if not ERRORLEVEL 0 (
echo. Uh oh, something bad happened
exit /b 0
)

这也是 Gnatcheck 或其他系统性地 return 不同于 0 的 ERRORLEVEL 的工具的问题,其中 Jenkins 正在等待 0 继续而不会出错。

在我自己 运行 处理同一问题时,我找到了一些方法来满足您的要求——在其他地方发布了几次。我发现其他解决方案可能会删除实际的错误文本,但会忽略表示我的应用程序失败的 %ERRORLEVEL%。我合法地想要 %ERRORLEVEL% 只要它不是 "No files found" 错误。

一些例子:

具体调试排除错误:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

使用 oneliner return ERRORLEVEL 成功或失败:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

对于 SQL Server Agent CmdExec 作业步骤,我进行了以下操作。不知道是不是bug,步骤里面的CmdExec只识别第一行代码。此外,CmdExec 不喜欢 2>&1 重定向 stderr 所以我用 cmd /c.:

封装了所有内容
cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%