150 votes

Obtenir que ROBOCOPY renvoie un code de sortie "correct" ?

Est-il possible de demander à ROBOCOPY de sortir avec un code de sortie qui indique le succès ou l'échec ?

J'utilise ROBOCOPY dans le cadre de mes configurations de construction TeamCity, et le fait de devoir ajouter une étape pour faire taire le code de sortie de ROBOCOPY me semble stupide.

En gros, j'ai ajouté ceci :

EXIT /B 0

au script qui est en cours d'exécution.

Cependant, cela masque bien sûr les problèmes réels que ROBOCOPY pourrait renvoyer.

En fait, j'aimerais avoir des codes de sortie de 0 pour SUCCÈS et non-zéro pour ÉCHEC au lieu du masque de bits que ROBOCOPY renvoie maintenant.

Ou, si ce n'est pas possible, existe-t-il une simple séquence de commandes batch qui traduirait le masque de bits de ROBOCOPY en une valeur similaire ?

52voto

Daniel Beck Points 105590

Conformément à aquí Robocopy possède les bits de code de sortie suivants qui composent le code de sortie :

0×10 Erreur grave. Robocopy n'a copié aucun fichier. Il s'agit soit d'une erreur d'utilisation, soit d'une erreur due à des privilèges d'accès insuffisants sur les répertoires source ou de destination.

0×08 Certains fichiers ou répertoires n'ont pas pu être copiés (des erreurs de copie se sont produites et la limite de réessai a été dépassée). Vérifiez ces erreurs plus en détail.

0×04 Des fichiers ou des répertoires mal assortis ont été détectés. Examinez le journal de sortie. Un nettoyage est probablement nécessaire.

0×02 Certains fichiers ou répertoires supplémentaires ont été détectés. Examinez le journal de sortie. Un certain nettoyage peut être nécessaire.

0×01 Un ou plusieurs fichiers ont été copiés avec succès (c'est-à-dire que de nouveaux fichiers sont arrivés).

0×00 Aucune erreur ne s'est produite et aucune copie n'a été effectuée. Les arborescences de répertoires source et destination sont complètement synchronisées.

Il suffit d'ajouter des instructions if/else qui EXIT /B 0 lorsque la valeur de retour est 1 ou peut-être 0, et EXIT /B 1 autrement. Même si des fichiers ont pu être copiés, il y a quelque chose d'anormal qui nécessiterait une intervention manuelle.

13voto

Ana cleto Points 11

De cette page vous pouvez ajouter une section à votre fichier batch qui utilise la liste des codes d'erreur pour sortir les erreurs et exécuter différentes sections de code :

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

9voto

GuestJohn Points 91

Certains posters ci-dessus ont manqué la subtilité du masque de bits. En particulier, paradroid n'a pas compris que le niveau d'erreur 3 indique une copie complètement réussie.

Notez que le bit 0x01, s'il est activé, indique que certains fichiers ont été copiés même s'il y a eu d'autres échecs. Ainsi, tous les niveaux d'erreur impairs indiquent toujours qu'au moins quelques fichiers ont été copiés. Notez également que le bit 0x02 indique simplement qu'il y a des fichiers à la destination qui ne sont pas présents à la source. Cela se produira si le commutateur /E est utilisé et que des fichiers ont été supprimés de la source depuis qu'une copie précédente a été prise. Cela ne devrait pas se produire si le commutateur /MIR est utilisé car il devrait supprimer les fichiers à la destination pour refléter la source (mais je ne l'ai pas testé).

Ainsi, les niveaux d'erreur 1 et 3 indiquent une copie réussie des fichiers sans erreur. De même, les niveaux d'erreur 0 ET 2 indiquent que la destination est à jour et qu'aucun fichier n'a été copié.

Pour ce que ça vaut, je suis arrivé à ce qui suit pour ma sauvegarde simple :

if errorlevel 16 echo Backup failed - see reason above & goto done

if errorlevel 8 echo All is not well - backup incomplete & goto done

if errorlevel 4 echo All is not well - some files were mismatched & goto done

if errorlevel 3 echo Backup completed successfully & goto done

if errorlevel 2 echo Backup already up to date - no files copied & goto done

if errorlevel 1 echo Backup completed successfully & goto done

if errorlevel 0 echo Backup already up to date - no files copied & goto done

J'ai choisi de ne pas me préoccuper des fichiers "supplémentaires".

Je n'ai aucune idée de la nature de l'erreur "mismatched" car elle ne s'est pas encore produite, mais je l'ai prévue au cas où.

8voto

paradroid Points 22121

J'utilise ceci :

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

7voto

ElectricLlama Points 196

Je suis d'accord avec Guest John - vous ne voulez vraiment indiquer une erreur que si le résultat est en fait 8 ou plus.

Pour convertir un résultat de robocopy en un résultat 0 (succès) ou 1 (échec), utilisable dans une tâche SQL Agent, j'utilise ceci :

  IF %ERRORLEVEL% LSS 8 EXIT /B 0
  EXIT /B 1

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X