J'ai un fichier de commandes qui appelle un programme VBScript (.vbs). Après l'avoir appelé, mon script de lot vérifie Cependant, je ne peux que le faire explicitement. Si une erreur de temps d'exécution inattendue se produit, les .Vbs quittent une boîte de dialogue d'erreur, Cependant, le code de sortie est zéro em> donc mon fichier de lot le pense réussi! Comment puis-je modifier ce comportement? P>
Et si vous envisagez de dire, utilisez % errorLEVEL% code> pour voir si le programme .vbs a échoué. Je peux signaler une défaillance avec un code de sortie dans le programme .vbs avec
wscript.quit (1) code>. P>
sur erreur goto code>, ne vous embêtez pas ... cette syntaxe est disponible dans VB régulier, mais pas dans VBScript. P>
5 Réponses :
Comme vous le dites, tout ce qui est disponible est sur erreur CV Suivant code>, donc votre forcé d'utiliser le motif:
Mais qu'en est-il des endroits où vous ne pensez pas qu'il y ait une chance de jeter une erreur, mais elle ( .wikipedia.org / wiki / inconnu_unknown )
@Joelfan - il suffit de le mettre autour de chaque ligne, simple ;-) oh et j'espère que "err.number" ne jette pas ;-)
Vous pouvez utiliser la technique décrite dans Cet article . Cela vous oblige à envelopper votre script dans une classe VBScript. P>
J'aime la technique et j'ai suscité votre réponse, mais j'ai toujours accepté ma propre idée, car elle gagne sur "la simplicité"
Lien non valide
J'ai pensé à une solution hors de la boîte ... qui dit que 0 doit signifier le succès? VBScript renvoie parfois un code de retour sur 0 pour les échecs, alors pourquoi ne pas embrasser cela? Adoptez 0 comme (au moins un possible) Code de défaillance et constituez un autre nombre (par exemple 10) en tant que «code de réussite». p>
à la fin du script, mettre wscript.quit (10). Cela ne sera frappé que si tout a réussi à ce point. Ensuite, au lieu de "si errorlevel 1" dans le fichier de commandes appelant, utilisez "si% errorlevel% == 10" p>
"Qui a dit que 0 doit signifier le succès?" ... Il s'agit d'une convention standard et de nombreux outils qui lancent d'autres processus le suppose. Voir Wikipedia's Statut de sortie Semantitique pour plus de détails. Cela dit, VBScript est suffisamment brisé à cet égard qu'il est assez attrayant à la convention de flutte compte tenu des alternatives limitées, si i> vous savez ce qui appellera votre script et i> que c'est bon avec cette. Sinon, vous pouvez envelopper votre script dans quelque chose qui, disons, soustrait 1 de votre code de sortie. Tant que vous n'avez pas écrit ce wrapper dans VBScript; ^]
Je pense que j'utiliserai personnellement un «fichier de lots de wrapper qui soustrait 1 de la solution de code de sortie CScript» à l'avenir. P> J'aime la solution liée à Fmunkert, mais je pense que cela vous oblige à mettre votre code dans une classe_intalise particulière, qui est au mieux maladroitement. J'ai conçu une solution associée qui n'exige pas cela; Vous simplement «commettez» un résultat réussi à la fin de votre code; Si cela n'est pas appelé, aucune exception provoque l'instance CLASS_TERMINATE DE SITEDCODEHHANDLER pour définir un code de sortie non nul. p> Notez que cet idiome est utilisé fortement en C ++, où il s'appelle RAII (acquisition de ressources est l'initialisation) p> Vous pouvez bien sûr embellir la classe ceci pour prendre en charge les autres codes de sortie, les messages d'erreur, etc. Vous voudrez peut-être mettre cela en commun. Fichier VBS et utilisez un Mécanisme pour inclut dans VBScript < / a> Pour le partager. P> Je ne connais pas les détails complets des descentes pour appeler wscript.quit lors de la dérive de pile en raison d'une exception à VBScript. J'ai introduit ce qui suit: p>
CAVEATS H2>
wscript.quit code> ou appelez le fichier
exitcodehandler.quit code> qui le fait pour vous. Cependant, s'appuyer sur l'une ou l'autre de ces méthodes peut ne pas toujours être pratique / possible, et il est assez non idiomatique et peut ne pas être ovous pour les mainteneurs. LI>
class_terminate code> est terminé (c.-à-d. après em> exitCodeHandler's
class_terminate code> appelle wscript.quit), vous semblez avoir une erreur . Vous pouvez obtenir un comportement similaire avec tous les objets COM qui sont détruits. Je ne sais pas dans quel ordre VBScript détruit les objets (ou même si c'est garanti), donc J'ai demandé à ce sujet dans une autre question < / a>. li>
ol> p>
Vous pouvez, si c'est une option, utilisez Jscript à la place, qui a un meilleur support pour la manipulation des exceptions, y compris un moyen simple de renvoyer un code de sortie non nulle à une exception. Voir la solution à Pourquoi mon jscript (hôte de script Windows) est sortie avec 0 sur une exception non capturée? P>
C'est la raison n ° 1 que nous choisissons Jscript sur VBScript (lorsque nous em> avez em> utiliser l'un des deux!) p>