batch file - simple - ¿Por qué cmd.exe tiene un comportamiento de nivel de error diferente en una máquina de 64 bits?
how to write a simple batch bat file (2)
Si hago un script por lotes llamado temp.bat (por ejemplo) que contenga:
exit /b 1
Cuando lo ejecuto de varias maneras, obtengo un comportamiento diferente en mi sistema XP de 32 bits frente a un sistema XP de 64 bits.
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 que controle cómo propaga la información errorlevel de los scripts por lotes. En este punto, no puedo encontrar ninguna explicación racional para esta diferencia.
Debe tener cuidado con exit / b, ya que en realidad no funciona correctamente en todas las instancias. Por ejemplo:
temp.bat&&echo 0||echo 1
Si temp.bat contiene exit / b 1, esperaría que 1 se imprima, pero no es así. Lamentablemente, la única forma de establecer realmente un código de salida de trabajo para un archivo por lotes es usar @%COMSPEC% /C exit 1
como la última línea en el archivo por lotes
El problema con el ejemplo de Anders es que usa un archivo .bat. Si usa un archivo .cmd, salga como está documentado.
El punto principal de tener ambos 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.