【问题标题】:Batch script error level is not getting reset [duplicate]批处理脚本错误级别未重置[重复]
【发布时间】:2019-07-03 08:43:29
【问题描述】:

我正在编写一个小型 BAT 文件,它将在其中搜索“FAIL”关键字,然后搜索 PASS - 如果没有找到,则将其视为错误:

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\30\s1>copy /y/v C:\output\test.log C:\agent\_work\30\s1\tttt.test_log.res   || exit /B 1
            1 file(s) copied.

    C:\agent\_work\30\s1>findstr /I /C:"FAIL" /I /C:"UNKNOWN" C:\agent\_work\30\s1\tttt.SystemWalk_log.res

    C:\agent\_work\30\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\30\s1\tttt.test_log.res
     if 1 NEQ 0 (set /a errno=2 )
    )
    PASSED
    PASSED
    PASSED
    PASSED
    PASSED

    C:\agent\_work\30\s1>cd C:\agent\_work\30\s1

    C:\agent\_work\30\s1>exit /B 2

    C:\agent\_work\30\s1>echo %ERRORLEVEL%
    2

实际上是因为它找到了“PASS”字符串而没有找到“FAIL”字符串 - 所以错误级别应该是 0 - 我该如何解决这个问题?

【问题讨论】:

  • 对不起,我使用的是 Win 10
  • 您发布的输出并不是运行您发布的脚本的真实反映。很明显%1 要么是test.log 要么是SystemWalk.log,而不是两者,我假设实际的论点是后者。以后进行不必要的更改时请小心。期望某些邪恶的天才可以通过您系统的C:\output 中的文件名来识别您的 PC、您自己、您的雇主等,这是绝对不合理的。

标签: windows batch-file cmd errorlevel


【解决方案1】:
 if %errorlevel% NEQ 0 (

应该是

 if errorlevel 1 (

标准delayedexpansion 问题 - 您需要调用延迟扩展 [数百篇关于此的 SO 文章 - 使用搜索功能] 以显示或使用在括号中的指令系列中更改的任何变量的运行时值 (又名“代码块”)。

在块语句(a parenthesised series of statements) 中,整个块被解析并然后执行。块中的任何%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 也是如此,只是前者可以在块内使用,而后者不能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2014-06-03
    • 2017-02-18
    相关资源
    最近更新 更多