Ich habe ein Post-Build-Ereignis, das einige Befehle für ein ac # -Projekt ausführt. Der letzte Befehl führte manchmal dazu, dass der ERRORLEVEL-Wert nicht gleich Null war und der Build dann fehlschlug.
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?
windows
batch-file
cmd
errorlevel
user95319
quelle
quelle
Antworten:
Wenn Sie verwenden
exit /b 0
, können Sie einerrorlevel 0
Skript aus einem untergeordneten Stapel zurückgeben, ohne auch das übergeordnete Skript zu verlassen.quelle
Scheint den Trick zu machen:
Nicht alles funktioniert und es ist nicht klar warum. Zum Beispiel die folgenden nicht:
quelle
"ver"
es sich um einen internen Befehl handelt, aber wie können Sie das beurteilen"help"
? Viele der aufgeführten Befehle in"help"
sind "externe" Befehle wie:Find.exe
,Findstr.exe
,Help.exe
,Subst.exe
,Wmic.exe
,Xcopy.exe
, ...Wenn in einem Pre- oder Post-Build-Ereignis 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, können Sie ihn schnell stummschalten und vermeiden Wenn Sie eine Prüfung auf eine Nicht-Null auslösen
errorlevel
, folgen Sie der fehlerhaften Zeile eine Zeile, die explizit Null zurückgibt:Dies ist im Wesentlichen eine generische Kombination der zuvor genannten Lösungen, die mit mehr als nur der letzten Zeile eines Ereignisses vor oder nach dem Build funktionieren .
quelle
<some failing command> || cmd /c "exit /b 0"
als Einzeiler verwenden.cmd /c "exit /b 9009"
, aber es scheint ein bisschen übertrieben, sie auf 0 zu setzen. Würdever > nul
(ein interner Befehl) nicht genauso gut mit weniger Aufwand funktionieren als das Laden einer weiteren Kopie der Befehlsshell mitcmd /c "exit /b 0"
?/b
wird nicht benötigt,cmd /c “exit 0”
funktioniert also auch gut.Ich fand, dass "exit 0" ein guter Weg ist, um dieses Problem zu lösen.
Anwendungsbeispiel:
wenn der UnderDevService-Dienst nicht gestartet wird.
quelle
Ich persönlich benutze dies:
cd .
Funktioniert auch in Unix-Shell.
Aber dieser könnte etwas schneller sein:
type nul>nul
Da
Process Monitor
zeigtQueryDirectory
Anrufe ancd .
PS:
cd .
hat einen weiteren schönen Nebeneffekt in der Unix-Shell. Das neu erstellte Arbeitsverzeichnis im Terminal wird wiederhergestellt, wenn es vor dem Löschen geöffnet wurde.quelle
Ich benutze
VERIFY
oderVERIFY > nul
quelle
Wenn dies ein Ausschnitt wie "Post-Build-Ereignis" usw. ist, können Sie Folgendes anhängen:
am Ende des letzten Befehls.
Alternative
ist sehr sauber und nicht idiomatisch - ein Leser, der die Windows-Shell kennt, weiß, was los ist und was Ihre Absicht war.
Wenn Sie sich jedoch in einem Batch-Skript befinden, möchten Sie möglicherweise Subrotinen verwenden, die dem "untergeordneten Batch-Skript" aus der Antwort von akf entsprechen.
Haben Sie eine Unterroutine:
und dann einfach
wo immer Sie es brauchen.
Hier ist ein vollständiges Beispiel:
Welche Ausgänge:
Wie Sie sehen - nur anrufen und über goto: eof zurückkehren ist nicht genug.
quelle
Hier sind einige andere Möglichkeiten zum Zurücksetzen des
ErrorLevel
Status, die sogar unter MS-DOS funktionieren (zumindest für Version 6.22):more < nul > nul rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned: sort < nul > nul
Die folgenden Methoden funktionieren nur unter MS-DOS:
command /? > nul fc nul nul > nul keyb > nul
Der Vollständigkeit halber setzt dies den
ErrorLevel
Status auf1
, der sowohl für Windows als auch für MS-DOS gültig ist:< nul find ""
quelle
>nul
Nach jedem Befehl hinzufügen , der wahrscheinlich fehlschlägt - dies scheint zu verhindern, dass der Build fehlschlägt.Sie können das Ergebnis des Befehls weiterhin überprüfen, indem Sie es untersuchen
%errorlevel%
.Zum Beispiel:
quelle
Nachdem ich alle anderen Antworten überprüft hatte, entschied ich mich herauszufinden, welcher Weg am effizientesten zum Zurücksetzen des FEHLERS war. Ich habe ein schnelles Skript erstellt, das die Zeit für die Ausführung der folgenden Aufgaben aufzeichnet:
Hier ist die Ausgabe:
Nachdem
Measure-Command {command}
ich mit in Powershell nachgesehen hatte , stellte ich fest, dass es nur wirklich akzeptiert wurdecd .
und -cmd /c "exit /b 0"
mache ich etwas falsch?Ich würde empfehlen, entweder
cd .
odertype nul
da weder einen Fußabdruck auf der Ausgabe der Konsole haben, noch sind sie in irgendeiner Weise langsam.Ja, mir ist ziemlich langweilig
quelle
cmd /C exit [/B] 0
sollte die langsamste sein, seit eine neuecmd.exe
Instanz geöffnet und geschlossen wird. Die anderen sind alle interne Befehle, daher gibt es keinen Dateisystemzugriff, um ausführbare Dateien zu finden…Folgendes funktioniert in modernen Windows-Systemen (NT-basierten Systemen) mit folgenden Funktionen
cmd.exe
:rem /* This clears `ErrorLevel`; the SPACE can actually be replaced by an rem arbitrary sequence of SPACE, TAB, `,`, `;`, `=`, NBSP, VTAB, FF: */ (call )
Der SPACE(oder genauer gesagt, eine beliebige Folge von einem oder mehreren Standard - Token - Separatoren, die sind SPACE(Code
0x20
), TAB(Code0x09
),,
,;
,=
, NBSP(Code0xFF
), VTAB(Code0x0B
) und FF(Code0x0C
)) obligatorisch; Wenn Sie es weglassen,ErrorLevel
wird stattdessen Folgendes festgelegt:rem // This sets `ErrorLevel` to `1`: (call)
Es gibt einen schönen Thread auf DosTips.com, in dem diese Technik aufgetaucht ist.
Hier ist eine alternative Methode, die jedoch auf das Dateisystem zugreift und daher möglicherweise etwas langsamer ist:
dir > nul rem /* Perhaps this is a little faster as a specific file is given rather rem than just the current directory (`.` implicitly) like above: */ dir /B "%ComSpec%" > nul
quelle
Ich benutze dies:
ping localhost -n 1> null
quelle
Ich habe immer nur benutzt;
Ich benutze es seit Eselsjahren.
quelle
errorlevel
die die interneerrorlevel