web-dev-qa-db-fra.com

Powershell: Comment puis-je empêcher les erreurs d'être affichées dans un script?

Lorsque mon script PowerShell tente, 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.

Depuis que mon script vérifie la valeur de $? après de tels appels, et affiche et enregistre les erreurs, je préférerais que les différentes lignes d’erreurs PowerShell ne soient pas affichées.

Comment puis-je désactiver ceux affichés pour mon script?

72
Andrew J. Brehm

Vous avez plusieurs options. Le plus simple consiste à utiliser les paramètres ErrorAction.

-Erroraction est un paramètre universel pour toutes les cmdlets. Si vous souhaitez ignorer certaines commandes spéciales, vous pouvez utiliser -erroraction 'silentlycontinue' qui ignorera fondamentalement tous les messages d'erreur générés par cette commande. Vous pouvez également utiliser la valeur Ignore (dans PowerShell 3+):

Contrairement à SilentlyContinue, Ignore n'ajoute pas le message d'erreur à la variable automatique $ Error.

Si vous voulez ignorer toutes les erreurs d'un script, vous pouvez utiliser la variable système $ErrorActionPreference et faire la même chose: $ErrorActionPreference= 'silentlycontinue'

Voir about_CommonParameters pour plus d'informations sur -ErrorAction. Voir about_preference_variables pour plus d’informations sur $ ErrorActionPreference.

108
JNK

Windows PowerShell fournit deux mécanismes pour signaler les erreurs: un mécanisme pour erreurs de terminaison et un autre mécanisme pour erreurs non-terminantes.

Le code interne de CmdLets peut appeler une méthode ThrowTerminatingError en cas d'erreur qui empêche ou ne devrait pas permettre à la cmdlet de continuer à traiter ses objets d'entrée. L'auteur du script peut utiliser une exception pour intercepter ces erreurs.

EX:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

Le code CmdLets interne peut appeler une méthode WriteError pour signaler les erreurs non terminantes lorsque la cmdlet 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 la commande $ErrorActionPreference pour configurer l’ensemble du comportement du script.

15
JPBlanc

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'était pas résolue, Net émettait une erreur de terminaison. Pour éviter l'erreur de terminaison tout en conservant le contrôle de la sortie, j'ai créé une fonction à l'aide de TRAP.

PAR EXEMPLE.

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}
6
D-W

Vous êtes hors piste ici.

Vous avez déjà un beau message d'erreur. Pourquoi voudriez-vous écrire du code qui vérifie $? explicitement après chaque commande? C'est extrêmement lourd et sujet aux erreurs. La solution correcte est arrêtez de vérifier $? _ .

Utilisez plutôt le mécanisme intégré de PowerShell pour exploser pour vous. Vous l'activez en définissant le préférence d'erreur au niveau le plus élevé:

$ErrorActionPreference = 'Stop'

Je mets cela au sommet de chaque script que j'écris, et maintenant je n'ai pas à vérifier $?. Cela rend mon code considérablement plus simple et plus fiable.

Si vous rencontrez des situations dans lesquelles vraiment devez désactiver ce comportement, vous pouvez soit catch l'erreur, soit transmettre un paramètre à une fonction particulière à l'aide de le commun -ErrorAction . Dans votre cas, vous souhaitez probablement que votre processus s’arrête à la première erreur, détecte l’erreur, puis la consigne.

Notez que cela ne gère pas le cas où les exécutables externes échouent (code de sortie différent de zéro, de manière classique), vous devez donc toujours vérifier $LASTEXITCODE si vous en invoquez. Malgré cette limitation, le paramètre enregistre beaucoup de code et d’efforts.

Fiabilité supplémentaire

Vous pouvez également envisager d'utiliser mode strict :

Set-StrictMode -Version Latest

Cela empêche PowerShell de procéder en mode silencieux 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 permet à PowerShell de devenir un langage beaucoup plus rapide, ce qui facilite grandement la programmation.

2
jpmc26

Ajouter -ErrorAction SilentlyContinue à votre script et vous serez prêt à partir.

0
Jayant Rajwani