代码之家  ›  专栏  ›  技术社区  ›  Nepo

Batch的ERRORLEVEL工作不正常且奇怪

  •  0
  • Nepo  · 技术社区  · 7 年前

    我对批量错误级别有问题。 我在这里粘贴了两段代码片段来解决这个问题,并且可以重复。

    我在这里没有粘贴的是,我尝试了第二个延迟扩展的代码段,第一个尝试了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
    

    接下来,我为每个函数调用创建了两个变量来保持errorlevel,但使用以下代码运行它失败(并打开echo以找出失败的地方):

    @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 (
    

    我真的受不了了,谁能帮我一下吗?可能是函数退出的原因?

    提前感谢!

    1 回复  |  直到 7 年前
        1
  •  2
  •   npocmaka    7 年前

    你需要一个 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