2008-09-18 11 views
5

Teil der Installation für eine App, die ich verantwortlich bin, kompiliert einige C-Code-Bibliotheken. Dies geschieht in einer Konsole mit GNU Make.Pause GNU Machen Sie in einer Windows-Konsole, wenn ein Fehler auftritt

So, als Teil der Installation, öffnet sich ein Konsolenfenster, Sie sehen die Make-Datei Ausgabe Wiz von wie kompiliert und Links, wenn das Konsolenfenster geschlossen und das Installationsprogramm fortgesetzt wird.

Alles gut, es sei denn, es gibt einen Kompilierungsfehler. Dann kommt die make-Datei heraus und das Konsolenfenster wird geschlossen, bevor Sie eine Chance haben, herauszufinden, was passiert.

Also, was ich gerne geschehen würde, ist das Konsolenfenster Pause mit einem 'drücken Sie eine Taste, um fortzufahren' Typ Funktionalität, wenn es ein Fehler aus dem Makefile ist, so dass die Konsole geöffnet bleibt. Ansonsten verlasse einfach wie üblich und schließe die Konsole.

Ich kann nicht herausfinden, wie dies in einem GNU-Makefile oder aus einer Batch-Datei, die das Make ausführen könnte.

Antwort

9

dies sollte es tun:

if not ERRORLEVEL 0 pause 

Typ help if in DOS für weitere Informationen über Errorlevel Nutzung.

+0

Das ist für mich nicht funktionierte, als ob nicht Errorlevel 0 zurück, immer falsch als Error-immer> = 0 ist ich unten eine korrekte Version geschrieben. – Benja

+1

Ich sehe das Problem nicht. errorlevel wird vom Programmentwickler als Programmbeendigungscode festgelegt und zeigt einen Fehler an, wenn es nicht 0 ist. Wenn der Entwickler mit Code 2 oder 7 ausstieg, wird meine Bedingung als wahr ausgewertet, während "if ERRORLEVEL 1 "wird als falsch bewertet. –

+0

Es tut mir leid, es ist nur, dass ich eine .bat verwenden, um einen Dienst auszuführen, und anscheinend, wenn Sie es mit STRG + C herunterfahren, beendet es mit ERRORLEVEL 130, und ich wollte das Fenster nicht geöffnet bleiben in diesem Fall. – Benja

2

Dies ist, was Sie suchen:

if ERRORLEVEL 1 pause 

Wenn Sie t ype

HELP IF 

Sie erhalten diese Information: ERRORLEVEL Nummer | Gibt eine echte Bedingung an, wenn der letzte Programmlauf einen Exit-Code gleich oder größer als die angegebene Nummer zurückgegeben hat.

0

dieses einfache C-Programm Mit dem Exit-Code zu manipulieren:

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

Wir können in einer Batch-Datei wie so den Exit-Code testen:

test.exe 0 
IF ERRORLEVEL 0 PAUSE 

Zustand: 0 => 0 == TRUE

Wenn ERRORLEVEL = 0, wird die Pause auftreten weil die Logik >= oder größer als gleich ist. Dies ist wichtig, da nicht sofort klar ist, dass die Bedingung kein == Vergleich ist.

Beachten Sie, dass das Subsitting für 1 => 0 ebenfalls wahr ist und somit auch die Pause auftritt. Dies gilt für jede positive Zahl.

Wir können nur den gegenteiligen Effekt auslösen, indem Sie unten 0 gehen:

test.exe -1 
IF ERRORLEVEL 0 PAUSE 

Zustand: -1 => 0 == FALSE

Da ein ERRORLEVEL von 1 typischerweise bedeutet, dass es ein Fehler, und 0 keinen Fehler, wir kann einfach das Minimum in der Vergleichsbedingung erhöhen, um zu bekommen, was wir so wollen:

test.exe 0 
IF ERRORLEVEL 1 PAUSE 

Zustand: -1 => 1 == FALSE

Zustand: 0 => 1 == FALSE

Zustand: 1 => 1 == TRUE

In diesem Beispiel. das Skript wird anhalten, wenn ERRORLEVEL1 oder höher

Hinweis ist, dass dies ermöglicht -1 Exit-Codes der gleichen wie 0. Was wenn man nur 0 nicht pausieren möchte? Wir können eine separate Syntax:

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

Zustand: -1 != 0 == TRUE

Zustand: 0 != 0 == FALSE

Zustand: 1 != 0 == TRUE

In diesem Beispiel pausiert das Skript, wenn %ERRORLEVEL% ist nicht 0 Wir können dies tun, indem wir zuerst den Operator EQU benutzen, um zu überprüfen, ob %ERRORLEVEL% EQU 0, dann den Operator NOT, um den entgegengesetzten Effekt zu erhalten, der dem Operator != entspricht. Ich glaube jedoch, dass dies nur auf NT-Rechnern funktioniert, nicht auf DOS.

Referenzen:

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