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

时间:2015-03-19 14:38:15

标签: batch-file command-line jenkins cmd windows-console

我正在尝试使用此命令删除超过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
)

4 个答案:

答案 0 :(得分:1)

您可以创建goto标签以检查错误。只需将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

答案 1 :(得分:0)

您可以将此错误排序,保留所有其他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

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

答案 2 :(得分:0)

如果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等工具的问题,系统地将ERRORLEVEL与0不同,其中Jenkins等待0继续而不会出错。

答案 3 :(得分:0)

我发现有些方法可以解决你所问的问题,因为我自己遇到了同样的问题 - 在其他地方发布了几次。我发现其他解决方案可能会删除实际的错误文本,但忽略了%ERRORLEVEL%,这表示我的应用程序出现故障。只要它不是“找不到文件”错误,我合法地想要%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&&ECHO found error||echo found success

使用oneliner返回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代理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%