Question Obtenir que ROBOCOPY retourne un code de sortie "correct"?


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

Je me sers de ROBOCOPY dans le cadre de mes configurations de construction TeamCity, et devoir ajouter une étape pour simplement couper le code de sortie de ROBOCOPY me semble idiot.

Au fond, j'ai ajouté ceci:

EXIT /B 0

au script en cours d'exécution.

Cependant, cela masque bien sûr tout problème réel que ROBOCOPY pourrait rencontrer.

En gros, je voudrais avoir des codes de sortie de 0 pour SUCCESS et des codes non nuls pour FAILURE au lieu du masque de bits renvoyé par ROBOCOPY maintenant.

Ou, si je ne peux pas le faire, existe-t-il une simple séquence de commandes par lots qui traduirait le masque de bits de ROBOCOPY en une valeur similaire?


110
2018-05-07 13:03


origine


Il convient également de noter que les 8 premiers codes de sortie (0-7) ne sont apparemment pas des états d'erreur: stackoverflow.com/questions/16533843/psake-and-robocopy-failing - longda


Réponses:


Selon ici, Robocopy a les bits de code de sortie suivants qui constituent le code de sortie:

0 × 10 Erreur grave. Robocopy n'a copié aucun fichier. Il s'agit d'une erreur d'utilisation ou 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 tentatives a été dépassée). Vérifiez ces erreurs plus loin.

0 × 04 Certains fichiers ou répertoires incompatibles ont été détectés. Examinez le journal de sortie. Le ménage est probablement nécessaire.

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

0 × 01 Un ou plusieurs fichiers ont été copiés avec succès (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 de destination sont complètement synchronisées.

Ajoutez simplement 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 les fichiers ont pu être copiés, il y a quelque chose qui ne nécessite pas d'intervention manuelle.


43
2018-05-07 13:34





TechNet suggère ce one-liner pour convertir le code de sortie en un code de sortie plus traditionnel:

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

Ou ceci pour ignorer complètement le code de sortie (c’est-à-dire qu’il ne se soucie pas d’avoir échoué ou de réussir):

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

Cependant, les deux commandes ci-dessus mettront fin à un script après l'exécution de robocopy. C'est un problème en particulier pour les versions de CI. Si vous souhaitez utiliser robocopy dans ce scénario, vous devez définir le code d'erreur manuellement pour les codes de sortie non pertinents. Ci-dessous, tous les codes d'erreur inférieurs à 8 seront réécrits sans erreur et le script sera poursuivi si possible.

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

92
2018-06-18 05:26



Agréable. Nécessite des crochets autour de la commande robocopy, mais m'a sauvé en utilisant un script wrapper. - TheCodeKing
Je ne pouvais pas faire fonctionner ce one-liner comme une étape de construction en ligne de commande dans TeamCity. Je devais le déplacer sur une ligne distincte. J'ai également ajouté l'argument / B à la commande exit, bien que je ne pense pas que cela soit nécessaire. - MikeWyatt
Pour le déploiement de Teamcity (et pas uniquement Teamcity), il est utile de taper: IF %ERRORLEVEL% LEQ 3 set errorlevel=0 et à la ligne suivante: if %errorlevel% neq 0 exit /b %errorlevel% (si le fichier de commandes se compose de plusieurs opérations, pas seulement de robocopy), car les codes OK sont inférieurs à 3. ss64.com/nt/robocopy-exit.html - DaoCacao
Dans TeamCity, vous devriez échapper à la ERRORLEVEL avec double %%, comme ceci: %% ERRORLEVEL %%. Sinon, il considère que c'est le paramètre de construction TeamCity. - Yan Sklyarenko
Que fait le ^& faire? ss64 dit échappe-t-il mais il me semble que ça ne devrait pas être échappé? - mlhDev


L'exécuter depuis Jenkins a besoin des deux ( ) et /B. Si vous voulez ignorer le niveau d'erreur 1,2,3,4:

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

17
2018-05-07 13:35



LSS 8 pourrait être encore mieux :) - Ivan


De cette page vous pouvez ajouter une section à votre fichier de commandes qui utilise la liste des codes d'erreur pour générer 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

13
2018-05-07 14:54





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

8
2018-04-03 23:56





Certaines affiches ci-dessus ont manqué la subtilité du masque de bits. En particulier, paradroid a manqué que errorlevel 3 indique une copie complètement réussie.

Notez que le bit 0x01, s'il est défini, 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 certains fichiers ont été copiés. Notez également que le bit 0x02 indique simplement qu'il existe des fichiers à la destination qui ne sont pas présents à la source. Cela se produira si le commutateur / E est utilisé et que les fichiers ont été supprimés de la source depuis la copie précédente. Cela ne devrait pas arriver si le commutateur / MIR est utilisé car cela devrait supprimer les fichiers à la destination pour refléter la source (mais je n'ai pas testé cela).

Donc les deux niveaux d'erreur 1 et 3 indiquent une copie réussie des fichiers sans erreur. Les niveaux d'erreur 0 et 2 indiquent également que la destination est à jour et qu'aucun fichier n'a été copié.

Pour ce que cela vaut, je suis venu avec ce qui suit pour ma sauvegarde simple:

si errorlevel 16 echo Backup a échoué - voir la raison ci-dessus & goto done

si errorlevel 8 echo Tout ne va pas bien - sauvegarde incomplète et terminée

si errorlevel 4 echo Tout ne va pas bien - certains fichiers étaient incompatibles

si errorlevel 3 echo La sauvegarde s'est terminée avec succès et est terminée

si errorlevel 2 echo Sauvegarde déjà à jour - aucun fichier copié et obtenu

si le niveau d'erreur 1 écho La sauvegarde s'est terminée avec succès et est terminée

si errorlevel 0 echo Sauvegarde déjà à jour - aucun fichier copié et obtenu

J'ai choisi de ne pas m'embêter avec les fichiers «supplémentaires».

Je n'ai aucune idée de l'erreur due à la «mésappariement», car cela ne s'est pas encore produit, mais je l'ai autorisé au cas où.


8
2017-10-24 03:36





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

donc pour mapper un résultat robocopy à un résultat 0 (succès) ou 1 (échec), utilisable dans un travail d'agent SQL, j'utilise ceci:

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

6
2018-02-05 01:01





Pour TeamCity, je l'utilise et cela fonctionne très bien. Merci à MikeWyatt, DaoCacao et Yan Sklyarenko. J'avais juste besoin de voir un exemple de travail complet pour aider à visualiser la réponse.

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

2
2018-06-21 23:49



J'utilise un script robocopy similaire dans mon événement POST-BUILD. Les bibliothèques dépendantes sont donc copiées dans le projet d'application .exe consommant - qui ne sont référencées que via le modèle d'inversion de contrôle / localisateur de service. - bkwdesign


Un exemple ici sur la façon de copier les fichiers finis de Visual Studio 2010+ vers un autre dossier, car Visual Studio attend un 0 non 1 sur une bonne copie.

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

0
2017-11-08 22:20