318 votes

Comment faire un fichier batch résilier lorsqu’il rencontre une erreur ?

J’ai un fichier de commandes qui appelle le même exécutable encore et encore avec des paramètres différents. Comment puis-je faire résilier immédiatement si un des appels renvoie un code d’erreur de n’importe quel niveau ?

Fondamentalement, je veux l’équivalent de ContinueOnError de MSBuild = false.

326voto

system PAUSE Points 10051

Vérifier l' errorlevel en if déclaration, puis exit /b (sortie de l' *b*atch fichier uniquement, et non à l'ensemble de la cmd.exe processus) pour les valeurs de 1 ou plus.

same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%

Si vous voulez que la valeur de la variable errorlevel à se propager à l'extérieur de votre fichier de commandes

if %errorlevel% neq 0 exit /b %errorlevel%

mais si c'est à l'intérieur d'un for il devient un peu difficile. Vous aurez besoin de quelque chose de plus comme:

setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
    same-executable-over-and-over.exe /with different "parameters"
    if !errorlevel! neq 0 exit /b !errorlevel!
)

Edit: Vous avez pour vérifier l'erreur après chaque commande. Il n'y a pas de mondial "sur error goto" type de construction dans le cmd.exe/commande.com lot. J'ai aussi mis à jour mon code par CodeMonkey, bien que je n'ai jamais rencontré un négatif errorlevel dans aucun de mes lots de piratage sur XP ou Vista.

269voto

Fowl Points 1517

Ajouter à chaque ligne et ensuite définir un .

Par exemple, créer le fichier .cmd :

Voir aussi question à propos de quitter la sous-routine de fichier de lot.

105voto

Benoit Blanchon Points 2252

La plus courte :

Si vous avez besoin, vous pouvez définir le code de sortie :

Et vous pouvez également vous connecter :

2voto

Timbo Points 472

@system PAUSE : si l’exe se bloque, vous obtiendrez probablement un code d’erreur maximale tolérée (par exemple 0xC0000354). Il n’est également pas rare de « retour de -1' de programmes C++.

Pourquoi MS a décidé de faire %ERRORLEVEL% un int signé, que je ne saurai jamais. Lot a tellement de hacks pour vers l’arrière compatibilité, il semble étrange qu’ils ont négligé "si errorlevel #" face à des résultats éventuellement négatifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X