Ist es möglich, ROBOCOPY mit einem Beendigungscode zum Beenden aufzufordern, der Erfolg oder Misserfolg anzeigt?
Ich verwende ROBOCOPY als Teil meiner TeamCity-Build-Konfigurationen, und es erscheint mir dumm, einen Schritt hinzuzufügen, um den Exit-Code von ROBOCOPY zum Schweigen zu bringen.
Grundsätzlich habe ich folgendes hinzugefügt:
EXIT /B 0
zu dem Skript, das ausgeführt wird.
Dies maskiert jedoch natürlich alle echten Probleme, die ROBOCOPY zurückbringen würde.
Grundsätzlich möchte ich Exit-Codes von 0 für SUCCESS und von ungleich Null für FAILURE anstelle der Bitmaske haben, die ROBOCOPY jetzt zurückgibt.
Oder, wenn ich das nicht haben kann, gibt es eine einfache Folge von Stapelbefehlen, die die Bitmaske von ROBOCOPY in einen ähnlichen Wert übersetzen würden?
Antworten:
Wie hier hat Robocopy die folgenden Exit-Code-Bits, die den Exit-Code bilden:
Fügen Sie einfach if / else-Anweisungen hinzu,
EXIT /B 0
die besagen, dass der Rückgabewert 1 oder möglicherweise 0 ist, undEXIT /B 1
ansonsten. Auch wenn Dateien möglicherweise kopiert wurden, ist ein Fehler aufgetreten, der manuell behoben werden muss.quelle
TechNet schlägt diesen Einzeiler vor, um den Exit-Code in einen traditionelleren Exit-Code umzuwandeln:
Oder dies, um den Exit-Code vollständig zu ignorieren (dh es ist egal, ob er fehlgeschlagen ist oder erfolgreich war):
Beide obigen Befehle beenden jedoch ein Skript, nachdem die Robokopie ausgeführt wurde. Dies ist insbesondere für CI-Builds ein Problem. Wenn Sie in diesem Szenario Robocopy verwenden möchten, müssen Sie den Fehlercode für irrelevante Beendigungscodes manuell festlegen. Im Folgenden werden alle Fehlercodes unter 8 so umgeschrieben, dass überhaupt kein Fehler auftritt, und das Skript wird fortgesetzt, wenn dies möglich ist.
quelle
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
und in der nächsten Zeile:if %errorlevel% neq 0 exit /b %errorlevel%
(wenn die Batchdatei aus mehreren Vorgängen besteht, nicht nur aus Robocopy), da die OK-Codes kleiner als 3. ss64.com/nt/robocopy sind -exit.htmlERRORLEVEL
mit dem Doppelten %% wie folgt umgehen: %% ERRORLEVEL %%. Andernfalls wird es als TeamCity-Buildparameter betrachtet.^&
? ss64 sagt Flucht, aber es scheint mir, es sollte nicht entkommen werden?Um es von Jenkins aus zu starten, sind sowohl
( )
als auch erforderlich/B
. Wenn Sie die Fehlerstufe 1,2,3,4 ignorieren wollen:quelle
Auf dieser Seite können Sie Ihrer Batchdatei einen Abschnitt hinzufügen, in dem anhand der Liste der Fehlercodes die Fehler ausgegeben und verschiedene Codeabschnitte ausgeführt werden:
quelle
Ich benutze das:
quelle
Einige der oben genannten Poster haben die Feinheit der Bitmaske übersehen. Insbesondere hat paradroid übersehen, dass Errorlevel 3 eine vollständig erfolgreiche Kopie anzeigt.
Beachten Sie, dass das gesetzte Bit 0x01 anzeigt, dass einige Dateien kopiert wurden, auch wenn andere Fehler aufgetreten sind. Daher weisen ungerade nummerierte Fehlerebenen immer darauf hin, dass mindestens einige Dateien kopiert wurden. Beachten Sie auch, dass das Bit 0x02 lediglich angibt, dass sich am Zielort Dateien befinden, die an der Quelle nicht vorhanden sind. Dies ist der Fall, wenn die Option / E verwendet wird und Dateien aus der Quelle gelöscht wurden, seit eine vorherige Kopie erstellt wurde. Es sollte nicht passieren, wenn der Schalter / MIR verwendet wird, da dies Dateien am Ziel löschen sollte, um die Quelle zu spiegeln (aber ich habe dies nicht getestet).
So zeigen sowohl Fehlerebene 1 als auch 3 das erfolgreiche Kopieren von Dateien ohne Fehler an. Auch die Fehlerstufen 0 UND 2 zeigen an, dass das Ziel auf dem neuesten Stand ist und keine Dateien kopiert wurden.
Wofür es sich lohnt, habe ich mir für mein einfaches Backup folgendes ausgedacht:
Wenn Fehlerlevel 16 Echo Backup fehlgeschlagen ist - siehe Grund oben & fertig
Wenn Fehlerstufe 8 echo, ist nicht alles in Ordnung - Sicherung unvollständig und fertig
Wenn Fehlerstufe 4 echo, ist nicht alles in Ordnung - einige Dateien stimmen nicht überein und wurden nicht richtig bearbeitet
Wenn Fehlerstufe 3, Echo-Backup erfolgreich abgeschlossen und fertig
wenn errorlevel 2 echo Backup bereits aktuell ist - keine Dateien kopiert & fertig
Wenn Fehlerstufe 1, Echo-Backup erfolgreich abgeschlossen und fertig
wenn errorlevel 0 echo Backup bereits aktuell ist - keine Dateien kopiert & fertig
Ich habe beschlossen, mich nicht um die "zusätzlichen" Dateien zu kümmern.
Ich habe keine Ahnung, was der "nicht übereinstimmende" Fehler ist, weil er noch nicht aufgetreten ist, aber ich habe es für alle Fälle zugelassen.
quelle
Ich stimme Gast John zu - Sie möchten wirklich nur dann einen Fehler anzeigen, wenn das Ergebnis tatsächlich 8 oder höher ist.
Um ein Robocopy-Ergebnis einem 0-Ergebnis (Erfolg) oder 1-Ergebnis (Fehlschlag) zuzuordnen, das für die Verwendung in einem SQL Agent-Job geeignet ist, verwende ich Folgendes:
quelle
Für TeamCity verwende ich das und es funktioniert ganz gut. Vielen Dank an MikeWyatt, DaoCacao und Yan Sklyarenko. Ich brauchte nur ein voll funktionsfähiges Beispiel, um die Antwort zu visualisieren.
quelle
füge cmd / c davor für gitlab ci hinzu.
Andernfalls schließt EXIT 0 die CI-Pipeline an diesem Punkt.
quelle
Ein Beispiel zum Kopieren fertiger Dateien aus Visual Studio 2010+ in einen anderen Ordner, da Visual Studio eine 0 und keine 1 für eine gute Kopie erwartet.
quelle