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

9

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

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

我想说的是类似于:


"Script executed successfully"或者"Script execution failed with error code XYZ"
IF NOT FIND "[ERR" "test.csv"

或者说,如果输出中没有字符串"[ERR",则 ERRORLEVEL = 0 ,否则 ERRORLEVEL = 1
希望这样能够理解。我确定这很简单,但是设置错误级别似乎非常痛苦!
3个回答

11

如果至少找到一个[ERR,则在文本文件"test.csv"中查找 "[ERR" 会将 ERRORLEVEL 设置为 0,而如果没有找到[ERR,则设置为 1。您需要一种反转这个逻辑的方法。

如果您只想在未找到[ERR时立即返回 0,或者在找到至少一个[ERR时返回1,那么我建议使用以下代码:

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%

您好,dbenham。感谢您的回复。但很遗憾,仅添加/V似乎会导致错误级别始终设置为0。此外,我尝试使用批处理文件来测试第二个响应。FIND "[ ERR" "test.csv"SET MYERROR = 1 EXIT /B %MYERROR%当我echo %errorlevel%时,它应该始终返回1,但仅当test.csv文件中没有[ERR时才会这样做!我在语法方面有什么做错了吗?所有三个语句都在不同的行上,但我似乎无法开始新行以表示这一点!非常感谢您的回复! - Freddie Sizer
2
在再次运行代码后,我发现自己犯了一个DOS初学者错误!我把set err = 1写成了err=1。对于其他人,这意味着当你键入SET ERR =1时,变量名是'ERR '而不是'ERR'。谢谢! - Freddie Sizer
1
指定 /V 只有在文件中的 所有 行都包含指定值时才会导致失败(ERRORLEVEL == 1)。它将测试从 包含 x 转为 不包含 x,如果找到任何与测试匹配的行,则 ERRORLEVEL 为 0。 - Corey
@Corey - 哇,你说得对,我的逻辑没有得到期望的结果!我会编辑我的答案。我很惊讶在过去的五年中没有人指出这个错误,特别是原帖作者。 - dbenham
抱歉关于“僵尸帖子”(指回复已经过时的帖子)的问题...我在寻找这个答案时发现它是相反的。 - Corey
@Corey - 哎呀,不要道歉。纠正这样的信息非常重要。 - dbenham

4
请注意,IF命令的逻辑是,如果ERRORLEVEL大于或等于以下数字,则返回true!因此
IF ERRORLEVEL 0 (...

对于所有的FIND命令都返回true。如果你只想测试一个短语是否存在于文件中,你需要使用:

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

我花了很长时间才弄明白!


1
&& is a kind of shortcut for IF NOT ERRORLEVEL 1, so you could change your line to: find "string" "test.txt" > NUL && echo String was found || echo String was not found - Stephan

3

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

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

你可以在IF/ELSE块内放置任何命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接