2009-12-17 13 views
5

Si hago un temp.bat archivo por lotes llamado (por ejemplo) que contiene:¿Por qué cmd.exe tiene un comportamiento de nivel de error diferente en una máquina de 64 bits?

exit /b 1 

Cuando corro de varias maneras, me sale un comportamiento diferente en mi sistema XP de 32 bits vs 64 bits Sistema XP

en 32 bits:

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

en 64 bits:

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

he buscado a través de las opciones de cmd.exe y no he podido encontrar ninguna opción de controlar la forma en que propaga información de nivel de error de scripts por lotes. En este punto, no puedo encontrar ninguna explicación racional para esta diferencia.

+0

Supongo: la versión de 32 bits que mantiene el comportamiento original se debe a la compatibilidad con versiones anteriores. La versión de 64 bits no tiene ese requisito, por lo que tiene un comportamiento más amigable con las secuencias de comandos automatizadas. –

+0

Aha! La hija de Raymond [http://blogs.msdn.com/oldnewthing/archive/2003/12/24/45779.aspx] vs la dama de honor de Raymond [http://blogs.msdn.com/oldnewthing/archive/2009/12/02 /9931184.aspx#9931572] –

+0

No se puede reproducir aquí. Funciona igual en 32 y 64 bit. – Joey

Respuesta

7

Debe tener cuidado con exit/b, ya que en realidad no funciona correctamente en todos los casos. Por ejemplo:

temp.bat&&echo 0||echo 1

Si temp.bat contiene la salida/b 1 que se puede esperar de 1 a imprimir, pero no lo es. Lamentablemente, la única forma de establecer realmente un código de salida de trabajo de un archivo por lotes es utilizar @%COMSPEC% /C exit 1 como la última línea deen el archivo por lotes

+0

Excelente, probé su sugerencia y funciona igual en ambas máquinas. – paraquat

3

El problema con el ejemplo de Anders es que utiliza un archivo .bat. Si usa un archivo .cmd, salga como está documentado.

El punto principal de tener archivos .bat y .cmd parece ser la compatibilidad con versiones anteriores: si está ejecutando un archivo .bat, cmd intenta emular la CLI previa a NT, command.com, que tenía un manejo de errores mucho más simple .

Al menos esa es mi suposición. Me encontré con este hilo mientras busqué en Google documentos oficiales sobre el tema .bat/.cmd, que parece que no puedo encontrar.

Cuestiones relacionadas