2009-07-11 6 views
50

Ich habe ein Post-Build-Ereignis, das einige Befehle für ein C# -Projekt ausführt. Der letzte Befehl würde manchmal dazu führen, dass der ERRORLEVEL-Wert ungleich Null ist, und dann schlägt der Build fehl.Was ist der einfachste Weg, um ERRORLEVEL auf Null zurückzusetzen?

Ich möchte eine zusätzliche Befehlszeile anhängen, um den ERRORLEVEL-Wert immer auf Null zu setzen. Was ist der bequemste Weg, das zu tun?

+0

Der Build nicht wirklich scheitern, nur die IDE wie es aussieht. – Dykam

+8

Mir ist klar, das ist ein ziemlich alter Beitrag ... Ich hatte Erfolg darin, den Errorlevel auf 0 zu setzen, indem ich den Befehl "type nul" nach dem letzten Befehl absetzte. Hatte nur das Gefühl, dass es nützlich sein könnte. – Arun

Antwort

15

Ich fand, dass "exit 0" sieht aus wie eine gute Möglichkeit, mit diesem Problem umzugehen.

Verwendungsbeispiel:

NET STOP UnderDevService/Y

Ausfahrt 0

wenn der UnderDevService Dienst nicht gestartet wird.

+4

nicht, wenn Sie diese Stapeldatei auch über die Befehlszeile ausführen möchten, da exit 0 das Fenster schließt. cmd/c "exit/b 0" wie unten vorgeschlagen ist viel mehr benning – madoki

42

scheint den Trick zu tun:

ver > nul 

Nicht alles funktioniert, und es ist nicht klar, warum. Zum Beispiel die folgenden nicht:

echo. > nul 
cls > nul 
+9

Ich denke, der Grund dafür, warum "echo" und "cls" nicht funktionieren, liegt darin, dass es sich um die Shell-eingebauten Befehle handelt, nicht um echte Programme. – user95319

+1

Ich gebe dir das, aber wo ist ver.exe? –

+0

Ich kann auch "ver.exe" oder "ver.com" nicht finden. Ich weiß nicht, wie ich das erklären soll. – user95319

56

Wenn Sie exit /b 0 verwenden, können Sie ein errorlevel 0 aus einem untergeordneten Stapel-Skript zurückgeben, ohne das übergeordnete Element zu beenden.

+4

Von allen vorgeschlagenen Lösungen ist dies wahrscheinlich die beste. Ich werde diese Zeile in ein Skript * resetErrorlevel.bat * werfen. Alles in allem ist die Tatsache, dass man so viel tun muss, um etwas so Triviales wie das Löschen der Fehlerquote eines Skripts zu tun, ein weiterer Beweis dafür, dass der Erfinder der Windows-Batch-Programmierung gejagt und hart bestraft werden sollte. ;) – antred

23

In einem Pre-oder Post-Build-Ereignis, wenn der Rückkehrcode einer ausführbaren Datei größer als Null ist und der Aufruf der ausführbaren Datei nicht die letzte Zeile des Pre-oder Post-Build-Ereignisses ist, ein schneller Weg stumm schalten sie und vermeiden einen Scheck für einen nicht-Null errorlevel Auslösung ist die fehlerhafte Linie mit einer Linie zu folgen, die ausdrücklich Null zurückgibt:

cmd /c "exit /b 0" 

Dies ist im wesentlichen eine generische Kombination der zuvor genannten Lösungen, die mit arbeiten mehr als nur die letzte Zeile eines Pre-oder Post-Build-Ereignisses.

+0

danke, das hat bei mir funktioniert. Der einfacher klingende Vorschlag von 'exit 0' oben schneidet es nicht ab, da ich nach dem Zurücksetzen des Errorlevels weiter Sachen machen will, nicht exit – madoki

+3

noch ausgefallener: Sie können ' || verwenden cmd/c "Ausgang/b 0" 'als ein Liner. – Kupiakos

+0

Ich mag diese Methode für die *** Einstellung *** ein beliebiger Fehlerlevel wie: 'cmd/c" exit/b 9009 "', aber es scheint ein bisschen übertrieben für die Einstellung auf 0 zu sein. Wäre nicht "ver> nul" (ein interner Befehl), funktioniert genauso gut mit weniger Overhead als das Laden einer anderen Kopie der Kommandozeile mit 'cmd/c" exit/b 0 "'? –

0

Fügen Sie >nul nach jedem Befehl hinzu, der wahrscheinlich fehlschlägt - dies scheint zu verhindern, dass der Build fehlschlägt.

Sie können das Ergebnis des Befehls überprüfen, indem Sie %errorlevel% untersuchen.

Zum Beispiel:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it) 
+1

Dies funktioniert nicht - die Shell wertet die gesamte Befehlszeile auf einmal aus, daher wird% errorlevel% ersetzt, bevor der Befehl "findstr" ausgeführt wird. Verwenden Sie stattdessen "if errorlevel 1", um einen Fehlerlevel ungleich Null zu testen. – UweBaemayr

+1

Wahrscheinlich schlägt Ihr CI-Server fehl, wenn er beispielsweise die Zeichenfolge "error" im Standardausgabe-/Standardfehler findet. Sie setzen den Status nicht zurück. Du bringst den Befehl einfach zum Schweigen. Für eine tiefere Stille benutze> nul 2> nul –

5

I VERIFY verwenden oder VERIFY > nul

-3

ich immer nur verwendet;

set ERRORLEVEL=0 

Ich habe es für Eselsjahre verwendet.

+22

Es ist einfach, aber es ist eine wirklich schlechte Idee, da dies eine Variable namens errorlevel erzeugt, die die interne Pseudovariable errorlevel überlagert. – jeb

+4

Crikey, du hast recht! Wow, sieht so aus, als ob ich seit Jahren Kugeln ausweichen würde :) – cirrus

+1

Das gleiche hier Cirrus! Danke Jeb! – PsychoData

0

ich dies mit:

ping localhost -n 1> null

+2

Wird auch als Schlafbefehl verwendet, wenn n> 1 ist. –

1

Wenn dies ein Schnipsel wie "Post-Build-Ereignis" usw., Dann werden Sie keine Probleme Anfügen sein:

(...) || ver > nul 

am Ende des letzten Befehls.

Alternativ

cmd /c "exit /b 0" 

ist sehr sauber und nicht-idiomatische - ein Leser, der Windows-Shell kennt, wird wissen, was los ist, und was war Ihre Absicht.

Wenn Sie jedoch in einem Batch-Skript sind, möchten Sie möglicherweise Subrotines verwenden, die eine leichte Entsprechung des "untergeordneten Batch-Skripts" aus der Antwort von akf sind.

Haben Sie ein Unterprogramm:

:reset_error 
exit /b 0 

und dann

nur
call :reset_error 

wo immer Sie es brauchen.

Hier ist ein komplettes Beispiel:

@echo off 
rem *** main *** 

call :raise_error 
echo After :raise_error ERRORLEVEL = %ERRORLEVEL% 

call :empty 
echo After :empty ERRORLEVEL = %ERRORLEVEL% 

call :reset_error 
echo After :reset_error ERRORLEVEL = %ERRORLEVEL% 

:: this is needed at the end of the main body of the script 
goto:eof 

rem *** subroutines *** 

:empty 
goto:eof 

:raise_error 
exit /b 1 

:reset_error 
exit /b 0 

Welche Ausgänge:

After :raise_error ERRORLEVEL = 1 
After :empty ERRORLEVEL = 1 
After :reset_error ERRORLEVEL = 0 

Wie Sie sehen - nur anrufen und Rückkehr über goto: eof ist nicht genug.

1

ich dies persönlich benutze:

cd .

auch in Unix-Shell funktioniert.

Aber dies könnte man ein bisschen schneller sein:

type nul>nul

Da Process Monitor zeigt QueryDirectory fordert cd .