Emitir
O &&
operador não respeita o %ErrorLevel%
valor. O comando que segue o operador é executado apesar %ErrorLevel%
de ser igual a 99.
Comando
cmd /c exit 99 echo %ErrorLevel% echo %ErrorLevel% && echo %ErrorLevel% echo %ErrorLevel%
Saída
99 99 99 99
Expandindo a questão
Pelo que entendi, o seguinte é verdade:
- O
&&
operador é equivalente aif "%ErrorLevel%" equ "0"
. - O
Echo
comando não altera o%ErrorLevel%
.
Solução de problemas
Tentei habilitar o Delayed Expansion usando cmd /v:on
e executando o comando a seguir, mas ele me deu a mesma saída. Testei o comando a seguir no console, em um arquivo .bat e em um arquivo .cmd.
setlocal EnableDelayedExpansion
cmd /c exit 99
echo %ErrorLevel%
echo %ErrorLevel% && echo !ErrorLevel!
echo %ErrorLevel%
Usar um if
comando muda o comportamento para o que eu espero. E mudar o código abaixo para substituir cmd /c exit 99
por cmd /c exit 0
muda a saída para 3 ecos de 99, em vez de 4 ecos de 99.
Comando
setlocal EnableDelayedExpansion cmd /c exit 99 echo %ErrorLevel% echo %ErrorLevel% & if "%ErrorLevel%" equ "0" echo !ErrorLevel! echo %ErrorLevel%
Saída
99 99 99
Responder
A resposta de wildkoala parece estar correta. O operador &&
and ||
verifica o código de saída do comando anterior, não o valor atual na variável %ErrorLevel%.
Alguns comandos não atualizam a variável %ErrorLevel%. No entanto, eles ainda terão um código de saída.
Mais informações podem ser lidas sobre a diferença entre nível de erro e códigos de saída no ss64 aqui .
A documentação geralmente simplifica a explicação dos operadores &&
and ||
para avaliar se %ErrorLevel% é 0.
Como avaliar o código de saída de um comando
Você pode usar o call
comando em uma variável ou um script que termina no comando que você deseja avaliar. Fazer isso forçará a variável %ErrorLevel% a ser atualizada com o código de saída do último comando.
Exemplo
cmd /v:on
set command1=cmd /c exit 99
set command2=echo hide output^>nul
%command1% & echo !ErrorLevel!
99
%command2% & echo !ErrorLevel!
99
call %command2% & echo !ErrorLevel!
0
call %command1% & echo !ErrorLevel!
99
O
&&
operador apenas verifica o status de saída do comando anterior, neste casoecho %ErrorLevel%
, não%ErrorLevel%
ele mesmo. Mesmo que seu comando anterior leve à%ErrorLevel%
mudança,&&
não o avaliará.Como resultado,
echo %ErrorLevel% && echo %ErrorLevel%
será executado seecho %ErrorLevel%
retornar um código de saída 0 (o que ele faz, pois foi executado com sucesso). Assim, como você descobriu, é necessário usar uma instrução if em vez disso.