configuração ERRORLEVEL para 0

11

O que eu tenho é um arquivo de lote que é um wrapper em torno de um instalador. Esse arquivo em lote verifica o nível de erro retornado pelo instalador e imprime de acordo. Notei que se eu executar set ERRORLEVEL=0 em um prompt de comando logo antes de iniciar o arquivo em lote (na mesma janela de comando / ambiente), o instalador nunca mexerá com o errorlevel e meu script em lote sempre retornará passado. Eu diria que% ERRORLEVEL% é uma variável definida pelo windows usada especificamente para imprimir erros de programas e scripts e que usar a variável em um arquivo de lote ou qualquer outra coisa seria "por sua conta e risco" porque poderia ser alterada a qualquer momento por outro processo. Pelo que parece, quando eu defino errorlevel no ambiente dado, então, de alguma forma, termina o uso de errorlevel como um detentor do código de saída. Alguém sabe por que isso é? Para mim, é apenas um comportamento inesperado e estranho. Qualquer informação sobre o assunto seria muito apreciada!

    
por user972276 23.09.2013 / 20:42

4 respostas

10

Você está redefinindo a variável do sistema em uma regular. Quando você fizer isso, o sistema não irá utilizá-lo até que a sessão de comando seja fechada.

A melhor maneira seria usar

exit /b 0

em outro arquivo de lote e chamá-lo de seu script principal. Onde o número 0 é o seu nível de erro desejado. Ou isso, ou use um comando que redefina o nível de erro para você, como echo, findstr etc.

Por exemplo, todos os comandos a seguir definem ERRORLEVEL como 0 no seu arquivo batch:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
    
por 23.09.2013 / 20:51
9

Você nunca deve atribuir seu próprio valor a variáveis dinâmicas do sistema, como ERRORLEVEL, PATH, CD, DATE, TIME, etc. Isso evitará que o código veja o valor dinâmico. Você pode restaurar o valor dinâmico simplesmente indefinindo o valor definido pelo usuário. Por exemplo:

set "errorlevel="

Se você quiser forçar o errorlevel a 0, você pode usar essa sintaxe totalmente não intuitiva, mas muito eficiente: (call ) . O espaço após a chamada é crítico. Se você quiser definir o nível de erro como 1, use (call) . É fundamental que não haja espaço após a chamada.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Um método mais intuitivo, mas menos conveniente, para definir o nível de erro é usar uma sub-rotina dedicada em um arquivo de lote:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

Ou se na linha de comando, você poderia usar

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
    
por 23.09.2013 / 21:55
4

Eu pessoalmente uso isso:

cd .

Funciona mesmo no shell unix.

    
por 22.07.2017 / 15:24
0

Esta é a única coisa que descobri que funciona.
chamar (sair / b 0)

Necessário em um script que usa script de terceiros que detecta ERRORLEVEL, mas não está redefinindo seu nível de erro adequadamente.

    
por 06.04.2018 / 01:43