Eu tenho um comportamento estranho, definindo o nível de erro em um script em lotes para 0.
Estou chamando um script a.bat
em lote em um trabalho Jenkins, que por sua vez chama um segundo script b.cmd
e avalia o nível de erro após a chamada:
:: b.cmd
:: some stuff, but relevant is only this:
@echo b errorlevel: %errorlevel%
EXIT /B 0
O script "principal":
:: 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
(Eu peguei emprestado o :seterr
material desta pergunta )
O que parece acontecer quando executo o trabalho de Jenkins:
md
retorna e nível de erro está definido como 1, porque o diretório já existe.- a chamada para
:seterr
não tem o efeito esperado, o nível de erro permanece 1 - a chamada para
b.cmd
termina sem problemas, o nível de errob
é 0, mas após a chamada o nível de erro aindaa
é 1, o que eu definitivamente não esperaria depois de ler as respostas da pergunta vinculada. - após o salto
:error
e a chamada depopd
, errorlevel repentinamente é redefinido para 0 - o que eu também não esperaria.
Alguém tem idéia do que pode estar acontecendo aqui? Não defini acidentalmente o nível de erro manualmente, por isso deve ser a variável do sistema, não definida pelo usuário.