Est-il possible de demander à ROBOCOPY de sortir avec un code de sortie indiquant le succès ou l'échec?
J'utilise ROBOCOPY dans le cadre de mes configurations de construction TeamCity, et devoir ajouter une étape pour simplement faire taire le code de sortie de ROBOCOPY me semble ridicule.
En gros, j'ai ajouté ceci:
EXIT /B 0
au script en cours d'exécution.
Cependant, cela masque bien entendu tous les problèmes réels que ROBOCOPY renverrait.
En gros, j'aimerais avoir des codes de sortie de 0 pour SUCCESS et non nuls pour FAILURE au lieu du masque binaire renvoyé par ROBOCOPY.
Ou, si je ne peux pas en avoir, existe-t-il une simple séquence de commandes batch permettant de traduire le masque binaire de ROBOCOPY en une valeur similaire?
Réponses:
Comme ici , Robocopy a les bits de code de sortie suivants qui constituent le code de sortie:
Ajoutez simplement des instructions if / else indiquant que
EXIT /B 0
lorsque la valeur de retour est 1 ou peut-être 0, etEXIT /B 1
sinon. Même si des fichiers ont peut-être été copiés, il y a quelque chose qui ne va pas et qui nécessite une intervention manuelle.la source
TechNet suggère à ce one-liner de convertir le code de sortie en un code de sortie plus traditionnel:
Ou ceci pour ignorer complètement le code de sortie (c.-à-d. Ne vous souciez pas de savoir s'il a échoué ou réussi):
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. En dessous, tous les codes d’erreur en dessous de 8 seront réécrits sans erreur du tout, et le script sera poursuivi si possible.
la source
IF %ERRORLEVEL% LEQ 3 set errorlevel=0
et sur la ligne suivante:if %errorlevel% neq 0 exit /b %errorlevel%
(si le fichier de commandes comprend plusieurs opérations, pas seulement robocopy), car les codes OK sont inférieurs à 3. ss64.com/nt/robocopy -exit.htmlERRORLEVEL
avec le double %%, comme ceci: %% ERRORLEVEL %%. Sinon, il considère qu'il s'agit du paramètre de génération TeamCity.^&
fait? ss64 dit s'échappe mais il me semble qu'il ne faut pas s'échapper?Le lancer depuis Jenkins a besoin des deux
( )
et/B
. Si vous voulez ignorer le niveau d'erreur 1,2,3,4:la source
À partir 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:
la source
J'utilise ceci:
la source
Certaines affiches ci-dessus ont manqué la subtilité du masque. 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 et numérotés 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 de la destination pour refléter la source (mais je n'ai pas testé cela).
Ainsi, les deux niveaux d'erreur 1 et 3 indiquent que la copie de fichiers a réussi sans erreur. De plus, les niveaux d'erreur 0 et 2 indiquent que la destination est à jour et qu'aucun fichier n'a été copié.
Pour ce qui en vaut la peine, j’ai proposé ce qui suit pour ma sauvegarde simple:
si errorlevel 16 echo Backup a échoué - voir la raison ci-dessus & goto terminé
si errorlevel 8 echo Tout ne va pas bien - sauvegarde incomplète & goto fait
si errorlevel 4 echo Tout ne va pas bien - certains fichiers ont été mal assortis et ont été effectués
si errorlevel 3 echo Backup est terminé et terminé
si errorlevel 2 echo Backup est déjà à jour - pas de fichiers copiés et continuez
si errorlevel 1 echo Backup est terminé et terminé
si errorlevel 0 echo Backup est déjà à jour - pas de fichiers copiés et continuez
J'ai choisi de ne pas me soucier des fichiers «supplémentaires».
Je ne sais pas du tout quelle est l'erreur «incompatible» car elle n'a pas encore eu lieu, mais je l'ai autorisée au cas où.
la source
Je suis d'accord avec Guest John - vous voulez vraiment indiquer une erreur si le résultat est réellement égal à 8 ou plus.
donc pour mapper un résultat robocopy à un résultat 0 (succès) ou 1 (échec), convenant à une utilisation dans un travail d'agent SQL, j'utilise ceci:
la source
Pour TeamCity, je l’utilise et cela fonctionne assez bien. Merci aux contributions de MikeWyatt, DaoCacao et Yan Sklyarenko. J'avais juste besoin de voir un exemple de travail complet pour aider à visualiser la réponse.
la source
ajoutez cmd / c devant lui pour gitlab ci.
sinon EXIT 0 ferme le pipeline CI à ce stade.
la source
Un exemple ici sur la façon de copier des fichiers finis à partir de Visual Studio 2010+ dans un autre dossier, car Visual Studio s'attend à ce que 0 soit 1 sur une copie correcte.
la source