ROBOCOPY dazu bringen, einen "richtigen" Exit-Code zurückzugeben?

75859
Lasse Vågsæther Karlsen

Ist es möglich, ROBOCOPY mit einem Exit-Code zu beenden, der den Erfolg oder Misserfolg anzeigt?

Ich verwende ROBOCOPY als Teil meiner TeamCity-Build-Konfigurationen, und einen Schritt hinzufügen zu müssen, um nur den Exit-Code von ROBOCOPY zum Schweigen zu bringen, erscheint mir dumm.

Grundsätzlich habe ich Folgendes hinzugefügt:

EXIT /B 0 

auf das Skript, das ausgeführt wird.

Dies verdeckt jedoch natürlich die wirklichen Probleme, die ROBOCOPY zurückgeben würde.

Grundsätzlich möchte ich Exit-Codes von 0 für SUCCESS und Nicht-Null für FAILURE anstelle der Bitmaske, die ROBOCOPY jetzt zurückgibt.

Oder, wenn ich das nicht kann, gibt es eine einfache Folge von Stapelbefehlen, die die Bitmaske von ROBOCOPY in einen ähnlichen Wert übersetzen würden?

111
Es sollte auch beachtet werden, dass die ersten 8 Exitcodes (0-7) offensichtlich keine Fehlerzustände sind: http://stackoverflow.com/questions/16533843/psake-and-robocopy-failing longda vor 10 Jahren 2

10 Antworten auf die Frage

94
Richard Dingwall

TechNet schlägt diesen One-Liner vor, um den Exit-Code in einen traditionelleren Exit-Code umzuwandeln:

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0 

Oder um den Exit-Code vollständig zu ignorieren (dh es ist egal, ob er fehlgeschlagen ist oder erfolgreich war):

(robocopy c:\dirA c:\dirB *.*) ^& exit 0 

Beide Befehle oben beenden jedoch ein Skript, nachdem die Robocopy ausgeführt wurde. Dies ist ein Problem speziell für CI-Builds. Wenn Sie in diesem Szenario Robocopy verwenden möchten, müssen Sie den Fehlercode für irrelevante Beendigungscodes manuell festlegen. Nachfolgend werden alle Fehlercodes unter 8 ohne Fehler neu geschrieben, und das Skript wird, falls möglich, fortgesetzt.

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0 
Nett. Benötigt Klammern um den Befehl robocopy, hat mich jedoch mit einem Wrapper-Skript gespeichert. TheCodeKing vor 12 Jahren 7
Ich konnte diesen One-Liner nicht als Befehlszeilen-Build-Schritt in TeamCity verwenden. Ich musste es in eine separate Zeile verschieben. Ich habe auch das Argument / B zum Exit-Befehl hinzugefügt, obwohl ich denke, dass dies nicht erforderlich war. MikeWyatt vor 12 Jahren 0
Für die Teamcity-Bereitstellung (und nicht nur für Teamcity) ist es nützlich, Folgendes einzugeben: `IF% ERRORLEVEL% LEQ 3 set errorlevel = 0` und in der nächsten Zeile:` if% errorlevel% neq 0 exit / b% errorlevel% `(bei Stapelverarbeitung Die Datei besteht aus mehreren Vorgängen (nicht nur aus Robocopy), da OK-Codes weniger als 3 sind. http://ss64.com/nt/robocopy-exit.html DaoCacao vor 11 Jahren 0
In TeamCity sollten Sie das `ERRORLEVEL` mit doppeltem %% ausschalten, wie folgt: %% ERRORLEVEL %%. Ansonsten wird davon ausgegangen, dass es sich um einen TeamCity-Build-Parameter handelt. Yan Sklyarenko vor 10 Jahren 6
Was macht das `^ &`? [ss64] (https://ss64.com/nt/syntax-esc.html#escape) sagt Fluchtwege, aber es scheint mir, dass es nicht flüchtig sein sollte? mlhDev vor 7 Jahren 2
44
Daniel Beck

Per hier hat Robocopy die folgenden Exit - Code - Bits, die den Exit - Code bilden:

0 × 10 Schwerwiegender Fehler. Robocopy hat keine Dateien kopiert. Dies ist entweder ein Verwendungsfehler oder ein Fehler aufgrund unzureichender Zugriffsberechtigungen für die Quell- oder Zielverzeichnisse.

0 × 08 Einige Dateien oder Verzeichnisse konnten nicht kopiert werden (Kopierfehler sind aufgetreten und die Wiederholungsgrenze wurde überschritten). Überprüfen Sie diese Fehler weiter.

0 × 04 Es wurden einige nicht übereinstimmende Dateien oder Verzeichnisse gefunden. Überprüfen Sie das Ausgabeprotokoll. Der Reinigungsservice ist wahrscheinlich notwendig.

0 × 02 Einige zusätzliche Dateien oder Verzeichnisse wurden gefunden. Überprüfen Sie das Ausgabeprotokoll. Möglicherweise ist ein Reinigungsservice erforderlich.

0 × 01 Eine oder mehrere Dateien wurden erfolgreich kopiert (dh neue Dateien sind angekommen).

0 × 00 Es sind keine Fehler aufgetreten und es wurde kein Kopiervorgang durchgeführt. Die Quell- und Zielverzeichnisbäume sind vollständig synchronisiert.

Fügen Sie einfach if / else-Anweisungen hinzu, EXIT /B 0wenn der Rückgabewert 1 oder möglicherweise 0 ist EXIT /B 1. Selbst wenn Dateien kopiert wurden, ist ein Fehler aufgetreten, der einen manuellen Eingriff erfordert.

18
Filippo Vitale

Das Ausführen von Jenkins erfordert beides ( )und /B. Wenn Sie die Fehlerstufe 1,2,3,4 ignorieren möchten:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0 
LSS 8 könnte noch besser sein :) Ivan vor 6 Jahren 1
13
Mokubai

Auf dieser Seite können Sie Ihrer Stapeldatei einen Abschnitt hinzufügen, der die Liste der Fehlercodes zur Ausgabe der Fehler und zum Ausführen verschiedener Codeabschnitte verwendet:

if %ERRORLEVEL% EQU 16 echo ***FATAL ERROR*** & goto end if %ERRORLEVEL% EQU 15 echo OKCOPY + FAIL + MISMATCHES + XTRA & goto end if %ERRORLEVEL% EQU 14 echo FAIL + MISMATCHES + XTRA & goto end if %ERRORLEVEL% EQU 13 echo OKCOPY + FAIL + MISMATCHES & goto end if %ERRORLEVEL% EQU 12 echo FAIL + MISMATCHES& goto end if %ERRORLEVEL% EQU 11 echo OKCOPY + FAIL + XTRA & goto end if %ERRORLEVEL% EQU 10 echo FAIL + XTRA & goto end if %ERRORLEVEL% EQU 9 echo OKCOPY + FAIL & goto end if %ERRORLEVEL% EQU 8 echo FAIL & goto end if %ERRORLEVEL% EQU 7 echo OKCOPY + MISMATCHES + XTRA & goto end if %ERRORLEVEL% EQU 6 echo MISMATCHES + XTRA & goto end if %ERRORLEVEL% EQU 5 echo OKCOPY + MISMATCHES & goto end if %ERRORLEVEL% EQU 4 echo MISMATCHES & goto end if %ERRORLEVEL% EQU 3 echo OKCOPY + XTRA & goto end if %ERRORLEVEL% EQU 2 echo XTRA & goto end if %ERRORLEVEL% EQU 1 echo OKCOPY & goto end if %ERRORLEVEL% EQU 0 echo No Change & goto end   :END REM END OF BATCH FILE 
8
paradroid

Ich benutze das:

robocopy ..... call :REPORT_ERRORLEVEL goto :EOF  :REPORT_ERRORLEVEL echo. if ERRORLEVEL 16 echo ***FATAL ERROR*** & goto :EOF if ERRORLEVEL 8 echo **FAILED COPIES** & goto :EOF if ERRORLEVEL 4 echo *MISMATCHES* & goto :EOF if ERRORLEVEL 2 echo EXTRA FILES & goto :EOF if ERRORLEVEL 1 echo Copy successful & goto :EOF if ERRORLEVEL 0 echo –no change– & goto :EOF 
8
GuestJohn

Einige der obigen Poster haben die Subtilität der Bitmaske übersehen. Insbesondere hat paradroid versäumt, dass der Fehlerlevel 3 eine vollständig erfolgreiche Kopie anzeigt.

Beachten Sie, dass das Bit 0x01 (falls gesetzt) ​​anzeigt, dass einige Dateien kopiert wurden, auch wenn andere Fehler aufgetreten sind. Daher zeigen ungerade nummerierte Fehler immer an, dass mindestens einige Dateien kopiert wurden. Beachten Sie auch, dass das Bit 0x02 einfach anzeigt, dass sich am Ziel Dateien befinden, die nicht in der Quelle vorhanden sind. Dies ist der Fall, wenn der Schalter / E verwendet wird und Dateien seit der letzten Kopie aus der Quelle gelöscht wurden. Es sollte nicht vorkommen, wenn der Schalter / MIR verwendet wird, da dadurch Dateien am Ziel gelöscht werden sollten, um die Quelle zu spiegeln (aber ich habe dies nicht getestet).

Beide Fehlerstufen 1 und 3 zeigen also das fehlerfreie Kopieren von Dateien an. Auch die Fehler 0 und 2 zeigen an, dass das Ziel aktuell ist und keine Dateien kopiert wurden.

Für das, was es wert ist, habe ich mir für mein einfaches Backup folgendes ausgedacht:

Wenn Fehler-Level 16-Echo-Backup fehlgeschlagen ist - siehe oben

if errorlevel 8 echo All ist nicht gut - Sicherung unvollständig & fertig

if errorlevel 4 echo All ist nicht in Ordnung - einige Dateien stimmen nicht überein und wurden ausgeführt

if errorlevel 3 echo Backup erfolgreich abgeschlossen & fertig

Wenn errorlevel 2 echo Backup bereits auf dem neuesten Stand ist - keine Dateien kopiert & fertiggestellt

if errorlevel 1 echo Die Sicherung wurde erfolgreich abgeschlossen

if errorlevel 0 echo Backup bereits auf dem neuesten Stand - es wurden keine Dateien kopiert

Ich habe mich entschieden, mich nicht um die "zusätzlichen" Dateien zu kümmern.

Ich habe keine Ahnung, was der "nicht übereinstimmende" Fehler ist, weil er noch nicht geschehen ist, aber ich habe es nur für den Fall zugelassen.

6
ElectricLlama

Ich stimme mit Guest John überein - Sie möchten wirklich nur einen Fehler anzeigen, wenn das Ergebnis tatsächlich 8 oder höher ist.

Um ein Robocopy-Ergebnis auf ein 0 (Erfolg) oder 1 (Fehler) Ergebnis zu mappen, das für die Verwendung in einem SQL-Agent-Job geeignet ist, verwende ich Folgendes:

 IF %ERRORLEVEL% LSS 8 EXIT /B 0 EXIT /B 1 
2
Paul Oliver

Für TeamCity verwende ich dies und es funktioniert sehr gut. Danke an MikeWyatt, DaoCacao und Yan Sklyarenko. Ich brauchte nur ein vollständiges Arbeitsbeispiel, um die Antwort zu visualisieren.

(robocopy .\Artifacts\Fitnesse %FitDestinationFolder% /MIR) IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0 IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%% EXIT 0 
Ich verwende ein ähnliches Robocopy-Skript in meinem POST-BUILD-Ereignis. Abhängige Bibliotheken werden in das ausführende .exe-Anwendungsprojekt kopiert, das nur über das Inversion-of-Control / Service Locator-Muster referenziert wird. bkwdesign vor 9 Jahren 1
0
Glenn Perkins

Hier ein Beispiel zum Kopieren fertiger Dateien aus Visual Studio 2010+ in einen anderen Ordner, da Visual Studio für eine gute Kopie eine 0 und keine 1 erwartet.

cmd /c (robocopy $(TargetDir) X:\$(TargetName) $(TargetFileName) $(TargetFileName).config *.dll *.json *.xml /xx) ^& IF %ERRORLEVEL% LEQ 1 exit 0 
0
Scott Pepper

addiere cmd / c davor für gitlab ci.

cmd /c (robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LEQ 1 exit 0 

Andernfalls schließt EXIT 0 die CI-Pipeline an diesem Punkt.