2008-09-18 5 views
5

Une partie de l'installation pour une application dont je suis responsable, compile certaines bibliothèques de code C. Ceci est fait dans une console en utilisant GNU Make. Donc, dans le cadre de l'installation, une fenêtre de la console s'ouvre, vous voyez la sortie du fichier make wiz à mesure qu'elle compile et lie, lorsque la fenêtre de la console se ferme et que le programme d'installation continue.Mettre en pause GNU Faire dans une console Windows si une erreur se produit

Tout va bien, à moins qu'il y ait une erreur de compilation. Ensuite, le fichier make bugs out et la fenêtre de la console se ferme avant que vous ayez une chance de comprendre ce qui se passe. Donc, ce que je voudrais arriver est que la fenêtre de la console se mette en pause avec une fonctionnalité de type 'appuyer sur une touche pour continuer', s'il y a une erreur dans le fichier make pour que la console reste ouverte. Sinon, quittez normalement et fermez la console.

Je ne peux pas m'expliquer comment faire cela dans un Makefile GNU ou à partir d'un fichier batch qui pourrait exécuter le Make.

Répondre

9

cela devrait faire l'affaire:

if not ERRORLEVEL 0 pause 

Type help if sous DOS pour plus d'informations sur l'utilisation errorlevel.

+0

Cela n'a pas fonctionné pour moi, comme si elle n'ErrorLevel 0 toujours retourne false comme ERRORLEVEL est toujours> = 0. J'ai posté une version correcte ci-dessous. – Benja

+1

Je ne vois pas le problème. errorlevel est déterminé par le développeur du programme comme le code de sortie de l'application et indique une erreur si ce n'est pas 0. Si par hasard le développeur a choisi de sortir avec le code 2 ou 7, ma condition sera vraie, alors que "si ERRORLEVEL 1 "va évaluer comme faux. –

+0

Désolé, ça va, c'est juste que j'utilise un fichier .bat pour exécuter un service, et apparemment si vous le fermez avec Ctrl + C il quitte avec ERRORLEVEL 130, et je ne voulais pas que la fenêtre reste ouverte dans ce cas. – Benja

2

C'est ce que vous cherchez:

if ERRORLEVEL 1 pause 

Si vous t ype

HELP IF 

vous obtenez cette info: ERRORLEVEL number | Indique une condition vraie si la dernière exécution du programme a renvoyé un code de sortie égal ou supérieur à le nombre spécifié.

0

En utilisant ce programme simple C pour manipuler le code de sortie:

#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; 
    } 
} 

Nous pouvons tester le code de sortie dans un fichier batch comme ceci:

test.exe 0 
IF ERRORLEVEL 0 PAUSE 

Condition: 0 => 0 == TRUE

Lorsque ERRORLEVEL = 0, la pause se produira car la logique est >= ou supérieure ou égale à. Ceci est important, car il n'est pas immédiatement clair que la condition n'est pas une comparaison ==.

Notez que l'insertion de 1 => 0 sera également vraie et que la pause se produira également. Ceci est vrai pour tout nombre positif.

On peut déclencher l'effet inverse qu'en allant en dessous 0:

test.exe -1 
IF ERRORLEVEL 0 PAUSE 

Condition: -1 => 0 == FALSE

Depuis un ERRORLEVEL de 1 signifie généralement il y a une erreur, et 0 aucune erreur, nous peut simplement augmenter le minimum dans la condition de comparaison pour obtenir ce que nous voulons comme ça:

test.exe 0 
IF ERRORLEVEL 1 PAUSE 

Condition: -1 => 1 == FALSE

Condition: 0 => 1 == FALSE

Condition: 1 => 1 == TRUE

Dans cet exemple. le script se met en pause lorsque ERRORLEVEL est 1 ou plus

Notez que cela permet -1 les codes de sortie le même que 0. Que faire si l'on veut seulement 0 de ne pas mettre en pause? Nous pouvons utiliser une syntaxe distincte:

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

Condition: -1 != 0 == TRUE

Condition: 0 != 0 == FALSE

Condition: 1 != 0 == TRUE

Dans cet exemple, le script fait une pause si %ERRORLEVEL% n'est pas 0 Nous pouvons le faire en utilisant l'opérateur EQU pour d'abord vérifier si %ERRORLEVEL% EQU 0, puis l'opérateur NOT pour obtenir l'effet inverse, équivalent à l'opérateur !=. Cependant, je crois que cela ne fonctionne que sur les machines NT, pas simplement DOS.

Références:

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

Questions connexes