【问题标题】:Batch's ERRORLEVEL works improperly and weirdBatch 的 ERRORLEVEL 工作不正常且奇怪
【发布时间】:2017-12-22 09:53:09
【问题描述】:

我批量处理 ERRORLEVEL 时遇到问题。 我在这里粘贴了两个代码 sn-ps 到确切的问题,它可以重现。

我没有在这里粘贴的是我尝试了第二个代码 sn-p 延迟扩展和第一个 IF ERRORLEVEL 0 () 而不是 %ERRORLEVEL% == 0 但不幸的是导致了同样的问题。

首先尝试使用此代码:

@ECHO OFF

call :CheckFileExists .\Database.db3

echo CheckFileExists returned %ERRORLEVEL%
IF %ERRORLEVEL% == 0 (
    echo First check succeeded
    call :CheckFileExists .\dummy.txt

    echo CheckFileExists returned %ERRORLEVEL%
    IF %ERRORLEVEL% == 0 (
        echo Second check succeeded
    ) ELSE (
        echo Second check failed
    )
) ELSE (
    echo First check failed
)

GOTO :eof

:CheckFileExists
IF exist %1 (
    echo INFO: Necessary file exists: %1
) ELSE (
    echo ERROR: Necessary file missing: %1
    EXIT /B 1
)
EXIT /B

以及cmd中的结果:

INFO: Necessary file exists: .\Database.db3
CheckFileExists returned 0
First check succeeded
ERROR: Necessary file missing: .\dummy.txt
CheckFileExists returned 0
Second check succeeded

接下来,我为每个函数调用创建了两个变量来保存错误级别,但使用以下代码运行它失败(并使用 echo on 找出失败的地方):

@ECHO ON

call :CheckFileExists .\Database.db3

set error=%ERRORLEVEL%
echo CheckFileExists returned %error%
IF %error% == 0 (
    echo First check succeeded
    call :CheckFileExists .\dummy.txt
    set error2=%ERRORLEVEL%
    echo CheckFileExists returned %error2%
    IF %error2% == 0 (
        echo Second check succeeded
    ) ELSE (
        echo Second check failed
    )
) ELSE (
    echo First check failed
)

GOTO :eof

:CheckFileExists
IF exist %1 (
    echo INFO: Necessary file exists: %1
) ELSE (
    echo ERROR: Necessary file missing: %1
    EXIT /B 1
)
EXIT /B

为此,cmd中的结果:

call :CheckFileExists .\Database.db3

IF exist .\Database.db3 (echo INFO: Necessary file exists: .\Database.db3 )  ELSE (
echo ERROR: Necessary file missing: .\Database.db3
 EXIT /B 1
)
INFO: Necessary file exists: .\Database.db3

EXIT /B

set error=0

echo CheckFileExists returned 0
CheckFileExists returned 0
( was unexpected at this time.

        IF  == 0 (

我真的很困惑,有人可以帮助我吗?可能是函数的 EXIT ?

提前致谢!

【问题讨论】:

    标签: batch-file exit errorlevel


    【解决方案1】:

    你需要一个delayed expansion:

    @ECHO OFF
    setlocal enableDelayedExpansion
    call :CheckFileExists .\Database.db3
    
    echo CheckFileExists returned %ERRORLEVEL%
    IF %ERRORLEVEL% == 0 (
        echo First check succeeded
        call :CheckFileExists .\dummy.txt
    
        echo CheckFileExists returned !ERRORLEVEL!
        IF !ERRORLEVEL! == 0 (
            echo Second check succeeded
        ) ELSE (
            echo Second check failed
        )
    ) ELSE (
        echo First check failed
    )
    
    GOTO :eof
    
    :CheckFileExists
    IF exist %1 (
        echo INFO: Necessary file exists: %1
    ) ELSE (
        echo ERROR: Necessary file missing: %1
        EXIT /B 1
    )
    EXIT /B
    

    或使用IF ERRORLEVEL

    @ECHO OFF
    call :CheckFileExists .\Database.db3
    
    echo CheckFileExists returned %ERRORLEVEL%
    IF %ERRORLEVEL% == 0 (
        echo First check succeeded
        call :CheckFileExists .\dummy.txt
    
        call echo CheckFileExists returned %%ERRORLEVEL%%
        IF ERRORLEVEL  0 IF NOT ERRORLEVEL 1 (
            echo Second check succeeded
        ) ELSE (
            echo Second check failed
        )
    ) ELSE (
        echo First check failed
    )
    
    GOTO :eof
    
    :CheckFileExists
    IF exist %1 (
        echo INFO: Necessary file exists: %1
    ) ELSE (
        echo ERROR: Necessary file missing: %1
        EXIT /B 1
    )
    EXIT /B
    

    【讨论】:

    • 嗯,虽然我已经尝试过延迟扩展,但似乎可以正常工作,但是下一个 ERRORLEVEL 的修改检查'!'标记使它工作。这究竟是什么以及为什么?
    • @Nepo - 这就是延迟扩展的工作原理。如果您使用%,尽管打开了延迟扩展,该变量仍将以正常扩展进行扩展。要访问具有延迟扩展的变量,您需要 setlocal enableDelayedExpansion! 而不是 %
    • 不需要延迟扩展,因为它不在代码块中。
    • @Nepo 打开命令提示符窗口并运行set /?。延迟的环境变量扩展由 IF 条件和 FOR 循环的控制台窗口中的帮助输出解释。然后运行 ​​if /? 以显示此命令的帮助,解释语法 if errorlevel X 在我看来应该始终使用它,而不是 if %ERRORLEVEL% == Xif !ERRORLEVEL! == X 因为从 MS-DOS 到 Windows 10 都没有改变。另请参阅微软支持文章Testing for a Specific Error Level in Batch Files
    • @Nepo - IF ERRORLEVEL 实际上不读取 %errorlevel% 变量 - blogs.msdn.microsoft.com/oldnewthing/20080926-00/?p=20743
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2013-04-03
    • 2021-06-03
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多