it-swarm.com.de

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

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 albern, einen Schritt hinzuzufügen, um den Beendigungscode von ROBOCOPY einfach 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?

Gemäß hier hat Robocopy die folgenden Exit-Code-Bits, aus denen der Exit-Code besteht:

0 × 10 Schwerer Fehler. Robocopy hat keine Dateien kopiert. Dies ist entweder ein Verwendungsfehler oder ein Fehler aufgrund unzureichender Zugriffsrechte auf die Quell- oder Zielverzeichnisse.

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

0 × 04 Einige nicht übereinstimmende Dateien oder Verzeichnisse wurden erkannt. Untersuchen Sie das Ausgabeprotokoll. Housekeeping ist wahrscheinlich notwendig.

0 × 02 Einige zusätzliche Dateien oder Verzeichnisse wurden erkannt. Untersuchen Sie das Ausgabeprotokoll. Möglicherweise ist ein Reinigungsservice erforderlich.

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

0 × 00 Es sind keine Fehler aufgetreten und es wurde nicht kopiert. Die Quell- und Zielverzeichnisbäume sind vollständig synchronisiert.

Fügen Sie einfach if/else-Anweisungen hinzu, die EXIT /B 0, wenn der Rückgabewert 1 oder vielleicht 0 ist, und EXIT /B 1, wenn nicht. Auch wenn Dateien möglicherweise kopiert wurden, ist ein Fehler aufgetreten, der manuell behoben werden muss.

45
Daniel Beck

TechNet empfiehlt diesen Einzeiler, um den Exit-Code in einen traditionelleren Exit-Code umzuwandeln:

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

Oder dies, um den Exit-Code vollständig zu ignorieren (d. H. Es ist egal, ob er fehlgeschlagen ist oder erfolgreich war):

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

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.

(robocopy c:\dirA c:\dirB *.*) ^& IF %ERRORLEVEL% LSS 8 SET ERRORLEVEL = 0
101

Für die Ausführung von Jenkins aus werden sowohl ( ) als auch /B benötigt. Wenn Sie die Fehlerstufe 1,2,3,4 ignorieren möchten:

(robocopy XXX YYY) ^& IF %ERRORLEVEL% LEQ 4 exit /B 0
18
Filippo Vitale

Über diese Seite können Sie Ihrer Batch-Datei einen Abschnitt hinzufügen, der anhand der Liste der Fehlercodes die Fehler ausgibt und verschiedene Codeabschnitte ausführt:

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
13
Mokubai

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
paradroid

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 die Option/MIR verwendet wird, da dadurch Dateien am Ziel gelöscht werden sollten, um die Quelle zu spiegeln (ich habe dies jedoch 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 Fehlerlevel 4 echo, ist alles nicht in Ordnung - einige Dateien stimmen nicht überein und gehen zu Ende

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.

8
GuestJohn

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 (Fehler) zuzuordnen, 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
6
ElectricLlama

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.

(robocopy  .\Artifacts\Fitnesse %FitDestinationFolder% /MIR)
IF %%ERRORLEVEL%% LEQ 3 set errorlevel=0
IF %%ERRORLEVEL%% NEQ 0 EXIT /b %%ERRORLEVEL%%
EXIT 0
2
Paul Oliver

füge cmd/c davor für gitlab ci hinzu.

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

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

1
Scott Pepper

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.

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