59 votes

Fichiers par lots - Gestion des erreurs

Je suis en train d'écrire mon premier fichier batch pour déployer une solution asp.net. J'ai cherché sur Google une approche générale de la gestion des erreurs et je n'ai rien trouvé de vraiment utile.

En fait, si quelque chose ne va pas, je veux m'arrêter et imprimer ce qui a mal tourné.

Quelqu'un peut-il me donner des conseils ?

68voto

dbenham Points 46458

Je trouve généralement les opérateurs de concaténation de commandes conditionnelles beaucoup plus pratiques que ERRORLEVEL.

yourCommand && (
  echo yourCommand was successful
) || (
  echo yourCommand failed
)

Il y a une complication dont vous devez être conscient. La branche d'erreur se déclenchera si la dernière commande de la branche de succès soulève une erreur.

yourCommand && (
  someCommandThatMayFail
) || (
  echo This will fire if yourCommand or someCommandThatMayFail raises an error
)

La solution consiste à insérer une commande inoffensive dont le succès est garanti à la fin de la branche de succès. J'aime utiliser (call ) qui ne fait rien d'autre que de mettre le ERRORLEVEL à 0. Il existe un corollaire (call) qui ne fait rien à part mettre le ERRORLEVEL à 1.

yourCommand && (
  someCommandThatMayFail
  (call )
) || (
  echo This can only fire if yourCommand raises an error
)

Voir Un moyen infaillible de vérifier si le code de retour est différent de zéro (erreur) dans un fichier batch Windows. pour des exemples des subtilités nécessaires à l'utilisation de ERRORLEVEL pour détecter les erreurs.

17voto

Shay Erlichmen Points 23645

Vous devez vous renseigner sur ERRORLEVEL

8voto

M Jeremy Carter Points 73

Utiliser ERRORLEVEL lorsqu'il est disponible est l'option la plus simple. Cependant, si vous appelez un programme externe pour effectuer une tâche et qu'il ne renvoie pas les codes appropriés, vous pouvez diriger la sortie vers 'find' et vérifier le niveau d'erreur à partir de là.

c:\mypath\myexe.exe | find "ERROR" >nul2>nul
if not ERRORLEVEL 1 (
echo. Uh oh, something bad happened
exit /b 1
)

Ou pour donner plus d'informations sur ce qui s'est passé

c:\mypath\myexe.exe 2&1> myexe.log
find "Invalid File" "myexe.log" >nul2>nul && echo.Invalid File error in Myexe.exe && exit /b 1
find "Error 0x12345678" "myexe.log" >nul2>nul && echo.Myexe.exe was unable to contact server x && exit /b 1

7voto

Brad Bruce Points 4359

En dehors de ERRORLEVEL, les fichiers batch n'ont aucune gestion des erreurs. Vous devriez vous tourner vers un langage de script plus puissant. J'ai déplacé du code vers PowerShell .

La possibilité d'utiliser facilement les assemblages et méthodes .Net a été l'une des principales raisons pour lesquelles j'ai commencé à utiliser PowerShell. La gestion améliorée des erreurs en était une autre. Le fait que Microsoft exige désormais que tous ses programmes de serveur (Exchange, SQL Server, etc.) soient pilotables par PowerShell a été la cerise sur le gâteau.

Pour l'instant, il semble que tout le temps investi dans l'apprentissage et l'utilisation de PowerShell sera du temps bien utilisé.

5voto

Rob Davis Points 1

Un ping réussi sur votre réseau local peut être piégé en utilisant ERRORLEVEL .

@ECHO OFF
PING 10.0.0.123
IF ERRORLEVEL 1 GOTO NOT-THERE
ECHO IP ADDRESS EXISTS
PAUSE
EXIT
:NOT-THERE
ECHO IP ADDRESS NOT NOT EXIST
PAUSE
EXIT

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