J'ai un fichier batch qui appelle le même exécutable encore et encore avec des paramètres différents. Comment puis-je le terminer immédiatement si l'un des appels renvoie un code d'erreur de n'importe quel niveau?
Fondamentalement, je veux l'équivalent de MSBuild ContinueOnError=false
.
batch-file
Josh Kodroff
la source
la source
Réponses:
Vérifiez le
errorlevel
dans uneif
instruction, puisexit /b
(quittez le fichier b atch uniquement, pas l'intégralité du processus cmd.exe) pour les valeurs autres que 0.Si vous souhaitez que la valeur du niveau d'erreur se propage en dehors de votre fichier de commandes
mais si c'est à l'intérieur d'un
for
ça devient un peu délicat. Vous aurez besoin de quelque chose de plus comme:Edit: Vous devez vérifier l'erreur après chaque commande. Il n'y a pas de type global "en cas d'erreur" dans le lot cmd.exe / command.com. J'ai également mis à jour mon code par CodeMonkey , bien que je n'ai jamais rencontré de niveau d'erreur négatif dans aucun de mes hacking par lots sur XP ou Vista.
la source
neq
) activées / désactivées n'ont pas d'importance lors de l'utilisationif not errorlevel 1 exit /B
comme expliqué par Microsoft dans l'article de support Utilisation des opérateurs de redirection de commande et dans la sortie d'aide lors de l'exécutionif /?
dans une fenêtre cmd. Le niveau d'erreur actuel (code de sortie) est conservé à la fin du traitement du fichier de commandes avecexit /B
. Remarque:exit
avec le paramètre/B
nécessite des extensions de commande activées, voir Où GOTO: EOF revient-il?Ajoutez
|| goto :label
à chaque ligne, puis définissez un:label
.Par exemple, créez ce fichier .cmd:
Voir également la question sur la sortie du sous-programme de fichier de commandes .
la source
command || (SET ErrorLine=102 && goto :error)
||
été créé en premier lieu. Peut-être pas en particulier, mais "essayez de le faire par erreur" comme l'a mentionné Fowl. Ma question est la suivante: cela fonctionne-t-il pour tous les codes de sortie non nuls? Positifs seulement?cmd /k exit -1 && echo success || echo fail
- les impressions échouent.command || exit /b %errorlevel%
Le plus court:
Si vous en avez besoin, vous pouvez définir le code de sortie:
Et vous pouvez également vous connecter:
la source
%ERRORLEVEL%
n'est pas touché lorsque vous appelezexit /b
, donc le code d'erreur est transmisUne mise à jour mineure, vous devez changer les vérifications de "si errorlevel 1" à ce qui suit ...
En effet, sur XP, vous pouvez obtenir des nombres négatifs comme des erreurs. 0 = aucun problème, tout le reste est un problème.
Et gardez à l'esprit la façon dont DOS gère les tests "IF ERRORLEVEL". Il retournera vrai si le nombre que vous recherchez est ce nombre ou plus, donc si vous recherchez des numéros d'erreur spécifiques, vous devez commencer par 255 et réduire.
la source
Voici un programme polyglotte pour BASH et Windows CMD qui exécute une série de commandes et se ferme si l'une d'entre elles échoue:
J'ai utilisé ce type de chose dans le passé pour un script d' intégration continue sur plusieurs plates-formes .
la source
Je préfère la forme de commande OR, car je les trouve les plus lisibles (par opposition à avoir un if après chaque commande). Cependant, la manière naïve de le faire
command || exit /b %ERRORLEVEL%
est fausse .Cela est dû au fait que le lot développe les variables lors de la première lecture d'une ligne plutôt que lors de leur utilisation. Cela signifie que si le
command
dans la ligne ci-dessus échoue, le fichier de commandes se ferme correctement, mais il se termine avec le code retour 0, car c'est ce que la valeur de%ERRORLEVEL%
était au début de la ligne. Évidemment, cela n'est pas souhaitable dans notre script, nous devons donc activer l' expansion retardée , comme ceci:Cet extrait de code exécutera les commandes 1 à 4, et si l'une d'entre elles échoue, elle se fermera avec le même code de sortie que la commande défaillante.
la source
Nous ne pouvons pas toujours dépendre de ERRORLEVEL, car de nombreux programmes externes ou scripts batch ne renvoient pas de codes de sortie.
Dans ce cas, nous pouvons utiliser des vérifications génériques des échecs comme ceci:
Et si le programme sort quelque chose sur la console, nous pouvons également le vérifier.
la source
Peu importe comment j'ai essayé, le niveau d'erreur reste toujours 0 même lorsque msbuild a échoué. J'ai donc construit ma solution:
Générez le projet et enregistrez le journal dans Build.log
recherchez la chaîne "0 Error" dans le journal de génération, définissez le résultat sur var
obtenir le dernier caractère, qui indique combien de lignes contiennent la chaîne de recherche
si chaîne introuvable, erreur> 0, échec de la construction
Cette solution a été inspirée par la publication de Mechaflash sur Comment définir la sortie des commandes en tant que variable dans un fichier de commandes
et https://ss64.com/nt/syntax-substring.html
la source
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
. Remarque:find "0 Error"
trouvera également10 Errors
.la source