definindo ERRORLEVEL como 0


14

Eu tenho um arquivo em lotes que é um invólucro em torno de um instalador. Este arquivo em lote verifica o nível de erro retornado pelo instalador e é impresso de acordo.

Percebi que, se eu executar set ERRORLEVEL=0em um prompt de comando antes de iniciar o arquivo em lotes (na mesma janela / ambiente de comando), o instalador nunca mexe com o nível de erro e meu script em lote sempre retorna passado. Eu diria que %ERRORLEVEL%é uma variável definida pelo Windows e é usada especificamente para imprimir erros de programas e scripts e que o uso da variável em um arquivo em lotes ou qualquer outra coisa seria "por sua conta e risco", pois poderia ser alterado a qualquer momento. outro processo.

Pelo que parece, quando defino o nível de erro no ambiente fornecido, ele termina de alguma forma o uso do nível de erro como detentor do código de saída. Alguém sabe por que isso é? Para mim, é apenas um comportamento estranho e inesperado. Qualquer informação sobre o assunto seria muito apreciada!


Respostas:


14

Você está redefinindo a variável do sistema para uma variável regular. Quando você faz isso, o sistema não o utilizará até que a sessão de comando seja fechada.

A melhor maneira seria usar

exit /b 0

em outro arquivo em lotes e chame-o a partir do seu script principal. Onde o número 0 é o que você deseja errorlevel. Ou use um comando que redefina errorlevelpara você, como eco, findstr etc.

Por exemplo, os seguintes comandos seriam todos definidos ERRORLEVELcomo 0 no seu arquivo em lotes:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
Quase correto. Você pode obter o "sistema" para usar o ERRORLEVEL dinâmica simplesmente retirar definição qualquer valor definido pelo usuário usandoset "errorlevel="
dbenham

Por que o Windows permite que alguém redefina uma variável do sistema para uma variável regular? As duas definições ainda existem, seu eco apenas e outros comandos apontam agora para o regular? Então os programas ainda podem estar atualizando a variável do sistema, apenas não é acessível através do prompt de comando?
user972276

1
"Ou isso ou use um comando que redefina o nível de erro para você, como echo, findstr etc." O comando echo não redefine a variável errorlevel.
antred 11/05/2015

Como já foi dito, se a errorlevel variável tiver sido definida "manualmente" pelo usuário / lote "set errorlevel=0", a errorlevelvariável não refletirá mais o código de saída, mas você ainda poderá acessar o código de saída com if errorlevel do something.
21416 Kevin Fegan

(1) Uma pergunta mais geral é: "Como defino ERRORLEVEL para algum valor arbitrário, como 42?"  cmd /c exit 42 parece ser a melhor resposta para isso. (2) Como  dbenham aponta , você não precisa  /bdas aspas.
Scott

12

Você nunca deve atribuir seu próprio valor a variáveis ​​dinâmicas do sistema, como ERRORLEVEL, CAMINHO, CD, DATA, HORA, etc. Isso evita 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, então você pode usar esta sintaxe totalmente não-intuitivo, mas muito eficaz: (call ). O espaço após a chamada é crítico. Se você deseja definir o nível de erro como 1, pode usar (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 em lotes:

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%

8

Eu pessoalmente uso isso:

cd .

Funciona mesmo em shell unix.


Mas, este pode ser um pouco mais rápido: type nul>nulporque o Process Monitor mostra QueryDirectorychamadas no cd .PS: cd .tem outro bom efeito colateral no shell unix. Ele restaura o diretório de trabalho recriado no terminal se ele tiver sido aberto antes da exclusão.
Andry

2

Aqui estão algumas outras maneiras de redefinir o ErrorLevelestado, que até funcionam no MS-DOS (pelo menos para a versão 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Os seguintes métodos funcionam apenas no MS-DOS:

command /? > nul

fc nul nul > nul

Por uma questão de integridade, isso define o ErrorLevelestado como 1válido para Windows e MS-DOS:

< nul find ""

1

Esta é a única coisa que eu achei que funciona.

call (exit /b 0)

Necessário em um script que usa script de terceiros que detecta ERRORLEVEL, mas não está redefinindo o nível de erro por si próprio.


0

Também funcionarão: (Define o nível de erro como 1)

Método 1

color 00

Método 2

echo A | find "B"

Você também pode usar isso para definir o nível de erro 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.