ERRORLEVEL Batch работает неправильно и странно

У меня проблема с ошибкой в ​​партии. Я вставляю сюда два фрагмента кода для точной проблемы, и это может быть воспроизведено.

Что я не вставил здесь, так это то, что я попробовал второй фрагмент кода с отложенным расширением и первый с 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

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 ответ

Решение

Вам нужно отложенное расширение:

@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
Другие вопросы по тегам