Por que o cmd.exe tem um comportamento de nível de erro diferente em uma máquina de 64 bits?

StackOverflow https://stackoverflow.com/questions/1924497

  •  20-09-2019
  •  | 
  •  

Pergunta

Se eu fizer um script em lote chamado temp.bat (por exemplo) contendo:

exit /b 1

Quando o executo de várias maneiras, recebo um comportamento diferente no meu sistema XP de 32 bits vs. um sistema XP de 64 bits.

Em 32 bits:

> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
0

Em 64 bits:

> temp.bat
> echo %ERRORLEVEL%
1
> cmd /c temp.bat
> echo %ERRORLEVEL%
1

Eu pesquisei através das opções do CMD.EXE e não consegui encontrar nenhuma opção que controlasse como ele propaga as informações do Nível de Error dos scripts em lote. Neste ponto, não consigo encontrar nenhuma explicação racional para essa diferença.

Foi útil?

Solução

Você precisa ter cuidado com a saída /b, pois ela realmente não funciona corretamente em todos os casos. Por exemplo:

temp.bat&&echo 0||echo 1

Se o temp.bat contiver saída /b 1, você esperaria que 1 fosse impresso, mas não é. Infelizmente, a única maneira de realmente definir um código de saída de trabalho para um arquivo em lote é usar @%COMSPEC% /C exit 1 Enquanto o último linha no arquivo em lote

Outras dicas

O problema do exemplo de Anders é que ele usa um arquivo .bat. Se você usar um arquivo .cmd, a saída funciona conforme documentado.

O ponto principal de ter arquivos .bat e .cmd parece ser compatibilidade com versões anteriores: se está executando um arquivo .bat, o CMD tenta imitar a CLI pré-nt, command.com, que tinha um manuseio de erro muito mais simples.

Pelo menos essa é minha suposição. Eu tropecei nesse tópico enquanto pesquisava no Google para documentos oficiais sobre a coisa .bat/.cmd, que não consigo encontrar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top