批处理脚本错误级别未重置
Batch script error level is not getting reset
我正在编写一个小的 BAT 文件,它将在其中搜索 "FAIL" 关键字后跟 PASS - 如果找到 none 则将其视为错误:
echo
set "topLevel=%cd%"
If [%1]==[] exit /B 1
If [%2]==[] exit /B 1
If [%3]==[] exit /B 1
If [%4]==[] exit /B 1
findstr /? >NUL 2>&1 || exit /B 1
set "arg1=%1"
set "arg2=%2"
set "arg3=%3"
set "arg4=%4"
set /a errno=0
if not exist %arg3% exit /B 1
if not exist %arg2%\%arg1% exit /B 1
set "logfile=%arg1:.=_%"
copy /y/v %arg2%\%arg1% %arg3%\%arg4%.%logfile%.res || exit /B 1
findstr /I /C:"FAIL" /I /C:"UNKNOWN" %arg3%\%arg4%.%logfile%.res
if %errorlevel% EQU 0 (
set /a errno=2
) ELSE (
REM MAKE SURE THAT THE SCRIPT DID NOT CRASH HENCE NEITHER PASS OR FAIL WILL BE LISTED
findstr /I /C:"PASS" %arg3%\%arg4%.%logfile%.res
if %errorlevel% NEQ 0 (
set /a errno=2
)
)
cd %topLevel%
exit /B %errno%
当我 运行 使用示例数据时,我得到以下输出:
..............................................
C:\agent\_work\s1>copy /y/v C:\output\test.log C:\agent\_work\s1\tttt.test_log.res || exit /B 1
1 file(s) copied.
C:\agent\_work\s1>findstr /I /C:"FAIL" /I /C:"UNKNOWN" C:\agent\_work\s1\tttt.SystemWalk_log.res
C:\agent\_work\s1>if 1 EQU 0 (set /a errno=2 ) ELSE (
REM MAKE SURE THAT THE SCRIPT DID NOT CRASH HENCE NEITHER PASS OR FAIL WILL BE LISTED
findstr /I /C:"PASS" C:\agent\_work\s1\tttt.test_log.res
if 1 NEQ 0 (set /a errno=2 )
)
PASSED
PASSED
PASSED
PASSED
PASSED
C:\agent\_work\s1>cd C:\agent\_work\s1
C:\agent\_work\s1>exit /B 2
C:\agent\_work\s1>echo %ERRORLEVEL%
2
实际上是因为它找到了 "PASS" 字符串而没有找到 "FAIL" 字符串 - 所以错误级别应该是 0 - 我该如何解决这个问题?
if %errorlevel% NEQ 0 (
应该是
if errorlevel 1 (
标准 delayedexpansion
问题 - 您需要调用 delayedexpansion [关于它的数百篇 SO 文章 - 使用搜索功能] 以显示或使用在其中更改的任何变量的 run-time 值带括号的一系列指令(又名 "code block")。
在块语句 (a parenthesised series of statements)
中,解析 整个 块并执行 then。块中的任何 %var%
将被该变量的值替换 在块被解析时 - 在执行块之前 - 同样的事情适用于 FOR ... DO (block)
.
因此,IF (something) else (somethingelse)
将在遇到 IF
时使用 %variables%
的值执行。
克服这个问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion
并使用 !var!
代替 %var%
来访问 var
的更改值或 2)调用子例程以使用更改后的值执行进一步处理。
如果 errorlevel
是 n 或大于 n,则 IF ERRORLEVEL n
为 TRUE。 IF ERRORLEVEL 0
因此始终为真。 IF NOT ERRORLEVEL 1
是对 errorlevel=0 的测试。 IF %ERRORLEVEL%==0
也是如此,只是前者可以在一个块内使用而后者不能。
我正在编写一个小的 BAT 文件,它将在其中搜索 "FAIL" 关键字后跟 PASS - 如果找到 none 则将其视为错误:
echo
set "topLevel=%cd%"
If [%1]==[] exit /B 1
If [%2]==[] exit /B 1
If [%3]==[] exit /B 1
If [%4]==[] exit /B 1
findstr /? >NUL 2>&1 || exit /B 1
set "arg1=%1"
set "arg2=%2"
set "arg3=%3"
set "arg4=%4"
set /a errno=0
if not exist %arg3% exit /B 1
if not exist %arg2%\%arg1% exit /B 1
set "logfile=%arg1:.=_%"
copy /y/v %arg2%\%arg1% %arg3%\%arg4%.%logfile%.res || exit /B 1
findstr /I /C:"FAIL" /I /C:"UNKNOWN" %arg3%\%arg4%.%logfile%.res
if %errorlevel% EQU 0 (
set /a errno=2
) ELSE (
REM MAKE SURE THAT THE SCRIPT DID NOT CRASH HENCE NEITHER PASS OR FAIL WILL BE LISTED
findstr /I /C:"PASS" %arg3%\%arg4%.%logfile%.res
if %errorlevel% NEQ 0 (
set /a errno=2
)
)
cd %topLevel%
exit /B %errno%
当我 运行 使用示例数据时,我得到以下输出:
..............................................
C:\agent\_work\s1>copy /y/v C:\output\test.log C:\agent\_work\s1\tttt.test_log.res || exit /B 1
1 file(s) copied.
C:\agent\_work\s1>findstr /I /C:"FAIL" /I /C:"UNKNOWN" C:\agent\_work\s1\tttt.SystemWalk_log.res
C:\agent\_work\s1>if 1 EQU 0 (set /a errno=2 ) ELSE (
REM MAKE SURE THAT THE SCRIPT DID NOT CRASH HENCE NEITHER PASS OR FAIL WILL BE LISTED
findstr /I /C:"PASS" C:\agent\_work\s1\tttt.test_log.res
if 1 NEQ 0 (set /a errno=2 )
)
PASSED
PASSED
PASSED
PASSED
PASSED
C:\agent\_work\s1>cd C:\agent\_work\s1
C:\agent\_work\s1>exit /B 2
C:\agent\_work\s1>echo %ERRORLEVEL%
2
实际上是因为它找到了 "PASS" 字符串而没有找到 "FAIL" 字符串 - 所以错误级别应该是 0 - 我该如何解决这个问题?
if %errorlevel% NEQ 0 (
应该是
if errorlevel 1 (
标准 delayedexpansion
问题 - 您需要调用 delayedexpansion [关于它的数百篇 SO 文章 - 使用搜索功能] 以显示或使用在其中更改的任何变量的 run-time 值带括号的一系列指令(又名 "code block")。
在块语句 (a parenthesised series of statements)
中,解析 整个 块并执行 then。块中的任何 %var%
将被该变量的值替换 在块被解析时 - 在执行块之前 - 同样的事情适用于 FOR ... DO (block)
.
因此,IF (something) else (somethingelse)
将在遇到 IF
时使用 %variables%
的值执行。
克服这个问题的两种常见方法是 1) 使用 setlocal enabledelayedexpansion
并使用 !var!
代替 %var%
来访问 var
的更改值或 2)调用子例程以使用更改后的值执行进一步处理。
errorlevel
是 n 或大于 n,则 IF ERRORLEVEL n
为 TRUE。 IF ERRORLEVEL 0
因此始终为真。 IF NOT ERRORLEVEL 1
是对 errorlevel=0 的测试。 IF %ERRORLEVEL%==0
也是如此,只是前者可以在一个块内使用而后者不能。