У меня странное поведение при установке уровня ошибки в пакетном скрипте на 0.
Я вызываю пакетный скрипт a.bat
для задания Jenkins, которое, в свою очередь, вызывает второй скрипт b.cmd
и оценивает уровень ошибки после вызова:
:: b.cmd
:: some stuff, but relevant is only this:
@echo b errorlevel: %errorlevel%
EXIT /B 0
"Основной" скрипт:
:: a.bat
pushd %CD%
cd..
@echo a errorlevel: %errorlevel%
set outputdir=".\some\exisiting\dir"
:: (1)
md %outpurdir%
@echo a errorlevel: %errorlevel%
:: (!)
if "$somevar" = "FOO" (
cd .\WhereBIs
:: (2)
call :seterr 0
@echo a errorlevel: %errorlevel%
:: (3)
call b.cmd
@if %errorlevel% neq 0 (
@echo a errorlevel: %errorlevel%
set errmsg=Error calling b
goto error
)
:: more stuff
)
:error
@echo %errmsg%
popd
:: (4)
@echo a errorlevel: %errorlevel%
@if %errorlevel% neq 0 exit %errorlevel%
Exit /B 1
:seterr
exit /b %1
(Я позаимствовал материал :seterr
из этого вопроса)
Что происходит, когда я запускаю работу Дженкинса:
md
возвращается и Равен 1, поскольку каталог уже существует.- вызов
:seterr
не имеет ожидаемого эффекта, уровень ошибки остается 1 - вызов
b.cmd
завершается без проблем, уровень ошибки вb
равен 0, но после вызова уровень ошибки вa
по- прежнему равен 1, чего я определенно не ожидал бы после прочтения ответов на связанный вопрос. - после перехода к
:error
и вызовуpopd
, errorlevel внезапно сбрасывается в 0 - чего я тоже не ожидал.
Кто-нибудь знает, что здесь происходит? Я случайно не установил уровень ошибки вручную, поэтому это должна быть системная переменная, а не пользовательская.