2008-09-18 5 views
5

Parte de la instalación de una aplicación de la que soy responsable, compila algunas bibliotecas de códigos C. Esto se hace en una consola usando GNU Make.Pausa GNU Hacer en una consola de Windows si ocurre un error

Por lo tanto, como parte de la instalación, se abre una ventana de la consola, se ve la salida del archivo make por compilación y enlaces, cuando termina la ventana de la consola se cierra y el instalador continúa.

Todo bien, a menos que haya un error de compilación. Luego haga que los errores de archivo salgan y la ventana de la consola se cierre antes de que tenga la oportunidad de descubrir lo que está sucediendo.

Por lo tanto, lo que me gustaría que ocurra es hacer que la ventana de la consola se detenga con una funcionalidad de tipo 'presionar una tecla para continuar', si hay un error en el archivo MAKE para que la consola permanezca abierta. De lo contrario, simplemente salga de manera normal y cierre la consola.

No puedo encontrar la forma de hacerlo en un archivo Make de GNU o en un archivo por lotes que podría ejecutar Make.

Respuesta

9

esto debe hacer el truco:

if not ERRORLEVEL 0 pause 

tipo help if en DOS para obtener más información sobre el uso del nivel de error.

+0

Esto no trabajaron para mí, como si no ErrorLevel 0 siempre devuelve falso como ERRORLEVEL es siempre> = 0. He publicado una versión correcta a continuación. – Benja

+1

No veo el problema. errorlevel es determinado por el desarrollador del programa como el código de salida de la aplicación, y está indicando un error si no es 0. Si por casualidad el desarrollador elige salir con el código 2 o 7, mi condición se evaluará como verdadera, mientras que "si ERRORLEVEL 1 "Evaluará como falso. –

+0

Lo siento, estás bien, es solo que estoy usando un .bat para ejecutar un servicio, y aparentemente, si lo cierras con Ctrl + C, sale con ERRORLEVEL 130, y no quería que la ventana permanezca abierta en ese caso. – Benja

2

Esto es lo que está buscando:

if ERRORLEVEL 1 pause 

Si no yp

HELP IF 

obtendrá esta información: número de ERRORLEVEL | Especifica una condición verdadera si la última ejecución del programa arrojó un código de salida igual o superior a el número especificado.

0

uso de este programa simple en C para manipular el código de salida:

#include <stdio.h> 
main(int argc, char *argv[]) { 
    if (argc == 2) { 
     // return integer of argument 1 
     return strtol(argv[1], NULL, 10); 
    } 
    else { 
     return 0; 
    } 
} 

podemos probar el código de salida en un archivo lotes así:

test.exe 0 
IF ERRORLEVEL 0 PAUSE 

Condición: 0 => 0 == TRUE

Cuando ERRORLEVEL = 0, se producirá la pausa porque la lógica es >= o mayor que igual. Esto es importante, ya que no está claro de inmediato que la condición no sea una comparación ==.

Observe que la subsituting para 1 => 0 también será verdadera, y por lo tanto la pausa también ocurrirá. Esto es cierto para cualquier número positivo.

Podemos provocar el efecto contrario sólo va a continuación 0:

test.exe -1 
IF ERRORLEVEL 0 PAUSE 

Condición: -1 => 0 == FALSE

Desde un ERRORLEVEL de 1 normalmente significa que hay un error, y 0 ningún error, solo puede aumentar el mínimo en la condición de comparación para obtener lo que queremos así:

test.exe 0 
IF ERRORLEVEL 1 PAUSE 

Condición: -1 => 1 == FALSE

Condición: 0 => 1 == FALSE

Condición: 1 => 1 == TRUE

en este ejemplo. el guión se detendrá cuando ERRORLEVEL es 1 o superior Aviso

que esto permite -1 códigos de salida el mismo que 0. ¿Qué pasa si uno solo quiere 0 para no pausar? Podemos utilizar una sintaxis independiente:

test.exe 0 
IF NOT %ERRORLEVEL% EQU 0 PAUSE 

Condición: -1 != 0 == TRUE

Condición: 0 != 0 == FALSE

Condición: 1 != 0 == TRUE

En este ejemplo, el script se detiene si %ERRORLEVEL% no es 0 Podemos hacer esto utilizando el operador EQU para verificar primero si %ERRORLEVEL% EQU 0, luego el operador NOT para obtener el efecto opuesto, equivalente al operador !=. Sin embargo, creo que esto solo funciona en máquinas NT, no en DOS.

Referencias:

http://chrisoldwood.blogspot.ca/2013/11/if-errorlevel-1-vs-if-errorlevel-neq-0.html http://ss64.com/nt/errorlevel.html

Cuestiones relacionadas