批处理编程从失败的FIND命令设置ERRORLEVEL

时间:2012-10-23 13:48:14

标签: batch-file error-handling errorlevel

我发现需要向调用批处理脚本的程序报告错误级别。

该脚本将创建一个CSV日志文件,我想检查该文件以显示脚本是否成功运行。

我想说的是

IF NOT FIND "[ERR" "test.csv"

或者说,如果字符串"[ERR"不在输出ERRORLEVEL = 0 ELSE ERRORLEVEL = 1

希望这是有道理的。我确信它很简单,但设置错误级别似乎是a $ se中的王室痛苦!

3 个答案:

答案 0 :(得分:10)

FIND“[ERR”“text.csv”如果找到至少一个[ERR则将ERRORLEVEL设置为0,如果未找到[ERR则设置为1。你需要一种方法来反转逻辑。

如果您只想找到[ERR,则立即返回0;如果找到至少一个1,则立即返回[ERR,那么我将使用以下内容:

find "[ERR" "test.csv" >nul && exit /b 1 || exit /b 0

如果要在稍后返回的变量中捕获结果,则:

find "[ERR" "test.csv" >nul && set "err=1" || set "err=0"

find "[ERR" "test.csv" >nul
set /a "err=!%errorlevel%"

准备好返回结果时

exit /b %err%

以下是我接受的原始答案,但 令人尴尬的错误 :-(
感谢Corey指出了逻辑错误。正如他在评论中所说,如果所有行都有[ERR文本,下面的错误代码只会报告错误。

  

如果找到,FIND会将ERRORLEVEL设置为0,如果未找到则设置为1。扭转   逻辑,只需使用/ V选项。

find /v "[ERR" "test.csv" >nul
     

如果你有一个指示错误级别的变量集,那么你可以   使用EXIT / B设置ERRORLEVEL

set err=1
exit /b %err%

答案 1 :(得分:2)

请注意,如果ERRORLEVEL 大于或等于以下数字,则IF命令具有返回true的逻辑!所以

IF ERRORLEVEL 0 (...
对于所有FIND命令,

返回true。如果您只想测试短语是否在文件中,您需要什么:

find "string" "test.txt" > NUL & IF NOT ERRORLEVEL 1 ECHO String was found

花了我很多时间来解决这个问题!

答案 2 :(得分:1)

这是我之前在BAT文件中使用的逻辑。

find "string" "test.txt" > NUL & IF ERRORLEVEL 1 (
    ECHO String was NOT found
) ELSE (
    ECHO String was found
)

您可以在IF / ELSE块中放置您想要的任何命令。