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