Lorsque mon script PowerShell essaie, par exemple, de créer un objet SQL Server pour un serveur qui n'existe pas («bla» dans mon cas), PowerShell affiche de nombreuses erreurs PowerShell en rouge.
Étant donné que mon script vérifie la valeur de $?
après de tels appels et affiche et enregistre les erreurs, je préfère ne pas afficher les plusieurs lignes d'erreurs PowerShell.
Comment puis-je désactiver ceux affichés pour mon script?
la source
-ErrorAction:SilentlyContinue
dans PS 5.1. J'appelais ma cmdlet à partir d'un lot, donc je ne sais pas si cela fait une différence. Mais de bonnes informations lorsque vous savez qu'une erreur acceptable peut être générée.Windows PowerShell fournit deux mécanismes pour signaler les erreurs: un mécanisme pour mettre fin aux erreurs et un autre mécanisme pour les erreurs sans fin .
Le code CmdLets interne peut appeler une
ThrowTerminatingError
méthode lorsqu'une erreur se produit qui n'autorise pas ou ne doit pas permettre à l'applet de commande de continuer à traiter ses objets d'entrée. Le scripteur peut utiliser une exception pour intercepter ces erreurs.EX:
Le code CmdLets interne peut appeler une
WriteError
méthode pour signaler des erreurs sans fin lorsque l'applet de commande peut continuer à traiter les objets d'entrée. Le rédacteur de script peut ensuite utiliser l'option -ErrorAction pour masquer les messages, ou utiliser$ErrorActionPreference
pour configurer l'ensemble du comportement du script.la source
J'ai eu un problème similaire en essayant de résoudre les noms d'hôtes en utilisant
[system.net.dns]
. Si l'adresse IP n'a pas été résolue, .Net a généré une erreur de fin. Pour éviter l'erreur de fin et conserver le contrôle de la sortie, j'ai créé une fonction à l'aide deTRAP
.PAR EXEMPLE
la source
Vous êtes loin d'être sur la bonne voie ici.
Vous avez déjà un gros message d'erreur. Pourquoi diable voudriez-vous écrire du code qui vérifie
$?
explicitement après chaque commande ? C'est extrêmement lourd et sujet aux erreurs. La bonne solution est d' arrêter de vérifier$?
.Au lieu de cela, utilisez le mécanisme intégré de PowerShell pour exploser à votre place. Vous l'activez en définissant la préférence d'erreur sur le niveau le plus élevé:
Je mets cela en haut de chaque script que j'écris, et maintenant je n'ai plus à vérifier
$?
. Cela rend mon code beaucoup plus simple et plus fiable.Si vous rencontrez des situations dans lesquelles vous avez vraiment besoin de désactiver ce comportement, vous pouvez soit
catch
l'erreur, soit transmettre un paramètre à une fonction particulière à l'aide du Common-ErrorAction
. Dans votre cas, vous souhaitez probablement que votre processus s'arrête à la première erreur, détecte l'erreur, puis enregistre-la.Notez que cela ne gère pas le cas où les exécutables externes échouent (code de sortie différent de zéro, par convention), vous devez donc toujours vérifier
$LASTEXITCODE
si vous en appelez. Malgré cette limitation, le paramètre économise encore beaucoup de code et d'efforts.Fiabilité supplémentaire
Vous pouvez également envisager d'utiliser le mode strict :
Cela empêche PowerShell de continuer silencieusement lorsque vous utilisez une variable inexistante et dans d'autres situations étranges. (Voir le
-Version
paramètre pour plus de détails sur ce qu'il restreint.)La combinaison de ces deux paramètres rend PowerShell beaucoup plus de langage à échec rapide, ce qui facilite grandement la programmation.
la source
Ajoutez
-ErrorAction SilentlyContinue
à votre script et vous serez prêt à partir.la source
Dans certains cas, vous pouvez diriger après la commande un Out-Null
la source
Si vous voulez que le message d'erreur PowerShell pour une applet de commande soit supprimé, mais que vous voulez quand même attraper l'erreur, utilisez "-erroraction 'silentlyStop'"
la source
New-Item -ItemType directory
(PowerShell v2.0)