web-dev-qa-db-fra.com

Fichiers batch - Traitement des erreurs

J'écris actuellement mon premier fichier de commandes pour le déploiement d'une solution asp.net ..__Je suis un peu sur Google pour une approche générale de gestion des erreurs et ne trouve rien qui soit vraiment utile.

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

Quelqu'un peut-il me donner des indications?

55
bplus

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

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

Il y a une complication dont vous devriez être au courant. La branche d'erreur se déclenchera si la dernière commande de la branche de succès génère une erreur.

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

Le correctif consiste à insérer une commande inoffensive dont la réussite est garantie à la fin de la branche de succès. J'aime utiliser (call ), ce qui ne fait rien sauf définir ERRORLEVEL sur 0. Il existe un corollaire (call) qui ne fait rien sauf définir ERRORLEVEL sur 1.

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

Voir Méthode infaillible pour vérifier le code retour non nul (erreur) dans le fichier de traitement des commandes Windows pour des exemples des subtilités nécessaires lors de l'utilisation de ERRORLEVEL pour détecter les erreurs.

61
dbenham

Autres que ERRORLEVEL, les fichiers de commandes n'ont aucune gestion d'erreur. Vous voudriez regarder un langage de script plus puissant. Je déplace le code vers PowerShell

La possibilité d'utiliser facilement des assemblages et des méthodes .Net est l'une des principales raisons pour lesquelles j'ai commencé à utiliser PowerShell. L'amélioration de la gestion des erreurs en était un autre. Le fait que Microsoft exige à présent que tous ses programmes de serveur (Exchange, SQL Server, etc.) soient pilotés par PowerShell était une pure pure récompense. 

À l’heure actuelle, il semble que tout le temps investi dans l’apprentissage et l’utilisation de PowerShell sera dépensé à bon escient.

7
Brad Bruce

Utiliser ERRORLEVEL quand 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 "rechercher" et en vérifier le niveau d'erreur.

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
6
M Jeremy Carter

Un ping réussi sur votre réseau local peut être intercepté à l'aide de 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
4
Rob Davis

Je suppose que cette fonctionnalité a été ajoutée depuis l'OP, mais pour les futures références, les erreurs générées dans la fenêtre de commande peuvent être redirigées vers un fichier indépendant de la sortie standard

commande 1> fichier - Écrire la sortie standard de commande dans un fichier

commande 2> fichier - Écrire l'erreur standard de commande dans fichier

0
TakenItEasy

Codes d'erreur Python Unittest, Bat process:

if __== "__main__":
   test_suite = unittest.TestSuite()
   test_suite.addTest(RunTestCases("test_aggregationCount_001"))
   runner = unittest.TextTestRunner()
   result = runner.run(test_suite)
   # result = unittest.TextTestRunner().run(test_suite)
   if result.wasSuccessful():
       print("############### Test Successful! ###############")
       sys.exit(1)
   else:
       print("############### Test Failed! ###############")
       sys.exit()

Codes de batte:

@echo off
for /l %%a in (1,1,2) do (
testcase_test.py && (
  echo Error found. Waiting here...
  pause
) || (
  echo This time of test is ok.
)
)
0
Tonny