Comment utiliser PowerShell Try Catch Enfin pour gérer les erreurs

15 juillet 2021 10258 Vues Autres informations importantes sur PowerShell Essayez

Un PowerShell Essayez de capturer block est utilisé pour gérer les erreurs dans les scripts PowerShell. Lors de l'utilisation de PowerShell Essayez de capturer bloc pour les scripts, vous pouvez réaliser ce qui suit :

  1. Faites en sorte que votre script continue de s'exécuter malgré une erreur
  2. Mieux afficher et gérer les messages d'erreur

Dans ce guide, vous apprendrez à utiliser Powershell Essayez de capturer blocs pour gérer les messages d'erreur de fin dans PowerShell. De plus, vous apprendrez à inclure les Enfin bloquer dans un Essayez de capturer bloquer.

Le guide commence par la syntaxe du Essayez de capturer bloquer.

Parcourir les sujets de publication

PowerShell Essayez de capturer Syntaxe

PowerShell Try Catch Syntaxe

La syntaxe de PowerShell Essayez de capturer est…

|__+_|

le Essayer est la partie du bloc que vous souhaitez que PowerShell surveille les erreurs. C'est le bloc avec les scripts d'origine qui peuvent renvoyer une erreur de fin.

Lorsqu'une erreur se produit dans le bloc Try, PowerShell enregistre l'erreur dans la variable automatique $Error (plus à ce sujet plus tard).

D'autre part, t il prise déclaration du PowerShell Essayez de capturer block gère les erreurs générées dans le bloc try. Vous pouvez également spécifier les types d'erreurs qui sont gérées dans le Prise bloc d'instructions.

le Enfin block peut être utilisé pour libérer toutes les ressources qui ne sont plus nécessaires au script.

Types courants d'erreurs d'exception dans PowerShell Essayez de capturer

Types d'erreurs dans PowerShell Try Catch

Vous pouvez gérer différents types d'erreurs dans un bloc PowerShell Try Catch. Par exemple, vous pouvez gérer des erreurs spécifiques.

De plus, vous pouvez gérer les messages d'erreur génériques. Cependant, pour gérer des types d'erreurs spécifiques, vous devez connaître le type d'erreur.

plus loin dans ce guide, vous apprendrez que les messages d'erreur sont enregistrés dans la variable automatique $error. De plus, les erreurs peuvent également être enregistrées dans la variable de pipeline $_.

De plus, les erreurs enregistrées dans la variable automatique $error sont enregistrées dans un tableau. Pour aider à expliquer cela, lançons une commande qui renvoie un message d'erreur de fin :

Pour effacer toutes les erreurs précédemment enregistrées dans le $erreur variable automatique, avant d'exécuter la commande ci-dessous, commencez par exécuter $error.Clear() commander. |__+_| Il n'y a pas de journal des événements appelé Systerr, donc la commande dans le bloc Try lancera un message d'erreur.

Étonnamment, la commande n'a affiché aucun message d'erreur. Alors, qu'est-il arrivé au message d'erreur ?

Il est enregistré dans la variable automatique $error ! Pour afficher l'erreur de la dernière commande, enregistrée dans la variable $error, exécutez la commande…

|__+_|

Le résultat de la commande affiche les détails de l'erreur enregistrés dans la variable automatique $error. Les informations d'erreur ont une section appelée ID d'erreur entièrement qualifié .

Pour cette erreur spécifique, le ID d'erreur entièrement qualifié a deux ensembles d'informations - System.InvalidOperationExceptionSystem.InvalidOperationException et Microsoft.PowerShell.Commands.GetEventLogCommand .

Les informations qui nous intéressent sont System.InvalidOperationExceptionSystem.InvalidOperationException . C'est un type d'erreur que vous pouvez prise dans le bloc PowerShell Try Catch.

Pour obtenir le nom de cette exception PowerShell, exécutez la commande ci-dessous :

|__+_|

Le voilà, System.InvalidOperationExceptionSystem.InvalidOperationException !

Dans les prochaines sous-sections, je discuterai des erreurs d'exception PowerShell Try Catch courantes.

PowerShell Essayez Catch CommandNotFoundException Erreur

Si vous exécutez une commande qui n'existe pas dans PowerShell ou l'invite de commande Microsoft, vous recevrez un message d'erreur. Par exemple, si vous lancez le Obtenir-Fichier commande, vous recevrez un message d'erreur car cette commande n'est pas une applet de commande PowerShell valide.

Voici une capture d'écran du résultat de la commande dans PowerShell…

PowerShell Essayez d'attraper l'erreur CommandNotFoundException

Comme vous pouvez le voir sur la capture d'écran, le type d'exception (FullyQualifiedErrorId ) est CommandNotFoundException .

Comme il s'agit d'une erreur de fin, cela empêchera votre script de continuer. Pour empêcher cette erreur de mettre fin à votre script, encapsulez la commande dans un Essayez de capturer bloquer.

Si nous encapsulons cette erreur dans un bloc PowerShell Try Catch, PowerShell supprimera l'erreur. De plus, cela l'empêchera de terminer votre script.

Cependant, même si l'erreur est supprimée, elle est enregistrée dans la variable $error. Comme d'habitude, avant d'exécuter la commande ci-dessous, effacez d'abord les erreurs enregistrées dans la variable $error.

|__+_|

Si vous souhaitez exécuter la commande dans PowerShell au lieu de PowerShell ISE, tapez les commandes sur une seule ligne comme indiqué ci-dessous :

|__+_|

Ensuite, pour afficher l'erreur, exécutez…

|__+_|

Comme je l'ai mentionné dans l'introduction principale de cette section, pour afficher l'ID d'exception pour cette erreur, exécutez la commande ci-dessous :

|__+_|

Le nom complet de l'exception est System.Management.Automation.CommandNotFoundException .

PowerShell Essayez Catch ManagementObjectNotFoundExceptionManagementObjectNotFoundException Erreur

Lorsque vous exécutez une commande dans une session PS distante avec des informations erronées, PowerShell renvoie un ManagementObjectNotFoundExceptionManagementObjectNotFoundException Erreur.

Un scénario typique est lorsque vous vous connectez à Office 365 avec PowerShell. Ensuite, exécutez la commande Get-User mais fournissez le mauvais utilisateur identité .

PowerShell Essayez Catch ManagementObjectNotFoundException Error

Pour intercepter cette erreur avec PowerShell Try Catch, utilisez une commande similaire à celle ci-dessous :

|__+_| Attraper le ManagementObjectNotFoundExceptionManagementObjectNotFoundException erreur avec PowerShell Try, Catch est particulièrement délicat. Vous devez utiliser le ErreurAction paramètre et spécifiez Arrêter . Sinon, même avec Try, Catch, l'erreur sera toujours affichée.

Enfin, pour obtenir le nom de l'exception, utilisez la commande ci-dessous :

|__+_|

La commande renvoie le type d'exception sous la forme System.Management.Automation.RemoteException . Donc qu'est-ce ManagementObjectNotFoundExceptionManagementObjectNotFoundException ?

ManagementObjectNotFoundExceptionManagementObjectNotFoundException est la raison de l'exception comme confirmé par la commande ci-dessous :

|__+_|

PowerShell Essayez Catch UnauthorizedAccessException Erreur

Une autre erreur d'exception PowerShell courante est UnauthorizedAccessException . Ce type d'erreur est généré lorsque vous essayez d'accéder à un élément pour lequel vous ne disposez pas au moins d'une autorisation de lecture.

Pour illustrer cet exemple, j'ai refusé aux utilisateurs authentifiés l'accès à un fichier spécifique sur mon ordinateur.

PowerShell Essayez d'attraper l'erreur UnauthorizedAccessException

Maintenant, si j'essaie d'accéder au fichier avec la commande Get-Content, je reçois un message d'accès refusé.

|__+_|

Pour arrêter l'affichage de cette erreur, exécutez la commande dans le bloc PowerShell Try Catch comme indiqué ci-dessous…

|__+_|

Malheureusement, la commande ci-dessus n'arrête pas l'affichage de l'erreur. La raison en est qu'il ne s'agit pas d'une erreur de terminaison.

Pour arrêter l'affichage de l'erreur, incluez le ErreurAction paramètre et spécifiez Arrêter .

|__+_|

Maintenant, la commande supprime l'erreur. Pour afficher le type d'exception, exécutez la commande ci-dessous…

|__+_|

Le type d'exception est System.UnauthorizedAccessException .

Il existe plus de types d'erreurs d'exception que ce qui est couvert dans cette section. Je n'ai couvert que les types d'exceptions les plus courants.

Comment capturer des exceptions spécifiques avec PowerShell Try Catch

Comment capturer des exceptions spécifiques avec PowerShell Try Catch

La dernière section a abordé les exceptions PowerShell courantes et comment trouver le type d'exception. Cette section explique comment utiliser ces informations pour capturer des types spécifiques de messages d'erreur.

Dans la section syntaxe de ce guide, j'ai dit que la syntaxe générale d'un PowerShell Try Catch Enfin est…

|__+_|

Dans le bloc catch de la syntaxe, vous pouvez voir le [type d'erreur]. C'est ici que vous spécifiez le type d'erreur que vous souhaitez intercepter dans ce bloc.

Par exemple, pour intercepter les erreurs UnauthorizedAccessException, utilisez les instructions ci-dessous…

|__+_|

Pour exécuter la commande dans PowerShell, spécifiez les instructions sur une seule ligne. La première partie de l'instruction – $error.Clear() – efface toutes les erreurs enregistrées dans la variable $error.

|__+_|

Comment ajouter plusieurs Prise Blocs dans un PowerShell Essayez de capturer Déclaration

Dans l'introduction de cette section, je vous ai montré comment intercepter un type spécifique d'exception dans le Prise bloquer. Vous pouvez spécifier plusieurs

Voici un exemple…

|__+_|

Dans cet exemple, le premier prise block gère les types d'exceptions spécifiés. De plus, le deuxième prise les poignées de bloc gèrent les erreurs génériques.

Comment extraire une exception d'erreur avec PowerShell Try Catch

La dernière sous-section a expliqué comment spécifier plusieurs blocs catch pour gérer différents types d'exceptions. Dans cette sous-section, vous apprendrez à extraire les détails de l'erreur dans une exception.

Pour illustrer cela, je vais utiliser un exemple que j'ai utilisé plus tôt. Exécutez cette instruction PowerShell dans PowerShell.

|__+_|

Maintenant, lancez $error seul…

|__+_|

Bien que plusieurs informations soient enregistrées dans la variable $error, le message d'erreur réel est mis en évidence dans la capture d'écran ci-dessous.

Comment extraire les détails d'erreur avec PowerShell Try Catch

Si vous souhaitez enregistrer cette erreur dans un fichier texte, il vous suffit d'enregistrer les détails de l'erreur réelle. Pour extraire cette erreur, utilisez la commande ci-dessous :

|__+_|

La commande extrait le message d'erreur réel. L'accès au chemin 'D:PS-Tutorialfolder-names.txt' est refusé.

Vous pouvez écrire ce message d'erreur dans un fichier journal en incluant un Out-File commande dans le bloc Catch.

|__+_| j'ai inclus le Ajouter paramètre dans le Out-File commande pour permettre la journalisation de plusieurs entrées sans écraser les entrées précédentes.

Pour faciliter la compréhension de la dernière commande, je vais la réécrire dans le format de script ci-dessous…

|__+_|

Comment inclure un Enfin Bloquer vers PowerShell Essayez de capturer Déclaration

Comment inclure un bloc finally dans l'instruction PowerShell Try Catch

Vous pouvez inclure un Enfin bloquer vers PowerShell Essayez de capturer Déclaration. La syntaxe est

|__+_|

le finalement block peut être utilisé pour libérer toutes les ressources qui ne sont plus nécessaires au script.

Un bloc finally s'exécute même si vous utilisez CTRL+C pour arrêter le script. Le bloc s'exécutera également si un mot-clé Exit arrête le script depuis un bloc Catch.

Dans le dernier exemple, j'avais l'instruction qui écrit le journal des erreurs dans un fichier texte dans le Prise bloquer. Cependant, le meilleur endroit pour avoir cette déclaration est dans un Enfin bloquer.

Voir le script modifié ci-dessous…

|__+_|

Informations utiles supplémentaires sur PowerShell Try Catch

Autres informations importantes sur PowerShell Essayez

Dans cette section, je partagerai des informations simples mais utiles sur PowerShell Try Catch.

Comment effacer la variable automatique PowerShell Try Catch $Error

La variable automatique $error a une Dégager Méthode. Vous pouvez utiliser cette méthode pour effacer toutes les erreurs enregistrées dans la variable automatique $error.

Pour effacer toutes les erreurs enregistrées dans la variable automatique $error pour la session PowerShell en cours, exécutez la commande ci-dessous.

|__+_|

Comment afficher un message d'erreur personnalisé dans PowerShell Try Catch Block

Pour afficher un message d'erreur personnalisé dans un PowerShell Try Catch Block, utilisez le mot Throw. Voici un exemple…

|__+_|

Voici le résultat de ce script dans PowerShell ISE .

Comment afficher un message d'erreur personnalisé dans PowerShell Try Catch Block

Comment obtenir des informations sur les informations de catégorie d'erreur dans PowerShell Try Catch

La variable automatique $error a une propriété appelée CategoryInfo. Pour voir cette propriété et d'autres propriétés et méthodes, exécutez la commande ci-dessous…

|__+_|

L'une des propriétés renvoyées par la dernière commande s'appelle InfoCatégorie .

Pour accéder à ces informations, exécutez la commande ci-dessous.

|__+_|

Cette commande renvoie plusieurs sous-propriétés.

Comment obtenir des informations sur les informations de catégorie d'erreur dans PowerShell Try Catch

Chacune de ces sous-propriétés est accessible en ajoutant le nom de la sous-propriété après un point. Par exemple, pour afficher les sous-propriétés Reason, exécutez la commande ci-dessous.

|__+_|

Comment utiliser Write-Host pour afficher les messages d'erreur dans PowerShell Try Catch

Comme la propriété CategoryInfo dans la dernière sous-section, la variable automatique $error a également une propriété appelée Exception . Pour afficher l'exception dans une erreur, exécutez la commande ci-dessous :

|__+_|

Malheureusement, si vous essayez d'afficher ces informations avec la commande Write-Host, cela ne fonctionne pas comme prévu.

|__+_|

Voici le résultat de cette commande dans PowerShell…

Comment utiliser Write-Host pour afficher les messages d'erreur dans PowerShell Try Catch

Comme vous pouvez le voir, la commande affiche un tas d'autres informations. La bonne nouvelle est que $error.Exception a une autre propriété appelée Message .

Vous pouvez appeler cette sous-propriété en l'ajoutant à $error.Exception , comme ça…

|__+_|

De plus, vous pouvez utiliser Hôte d'écriture commande pour afficher ces informations d'erreur…

|__+_|

La dernière commande affiche maintenant le message d'erreur réel…

Sauf qu'il y a une raison précise d'utiliser Hôte d'écriture comme indiqué dans la dernière commande, vous pouvez simplement afficher le même message d'erreur avec $error.Exception commander.

Comment créer une table de hachage dans un bloc PowerShell Try Catch

Il existe deux manières courantes de créer un Table de hachage PowerShell dans un bloc Try Catch.

  1. Vous pouvez créer une table de hachage avec plusieurs paires clé/valeur dans le bloc Try
  2. Alternativement, vous pouvez créer une seule table de hachage clé/valeur avec le Clé en dehors de Essayez Catch h bloc et la valeur dans le Essayez Catch bloc h.

Voici un exemple de la première méthode…

|__+_|

Comme vous pouvez le voir, la table de hachage est dans le Essayez Catch bloc h…

D'autre part, vous pouvez créer une seule clé de table de hachage avec la valeur définie dans un Essayez Catch bloc h. Voici un exemple…

|__+_|

Pour confirmer que le dernier script produit une table de hachage PowerShell, après avoir exécuté le script, j'ai appelé les valeurs enregistrées dans la variable $hashtable.

Comme vous pouvez le voir sur le résultat de la dernière commande, il y a une paire Nom/Valeur !

PowerShell Try Catch Exemples

PowerShell Try Catch Exemples

Dans cette dernière section, je couvrirai plusieurs exemples d'application de PowerShell Try Catch.

Comment utiliser PowerShell Essayez de capturer Avec Get-Childitem

La commande Get-Childitem peut renvoyer plusieurs erreurs. Pour illustrer les deux erreurs courantes, j'utiliserai les deux commandes ci-dessous :

|__+_|

Le chemin d'accès correct au fichier texte utilisé dans la dernière commande est D:PS-Tutorialfilelist.txt.

Cependant, dans la première commande, j'ai inclus un espace après D:PS-Tutorial. Cela a entraîné une erreur (nous déterminerons les détails de l'erreur sous peu).

De plus, dans la deuxième commande, j'ai spécifié le chemin correct mais j'ai utilisé le mauvais nom de fichier. Cela a entraîné une erreur.

|__+_| Comment utiliser PowerShell Essayez Catch avec Get-Childitem

Passant à autre chose, pour obtenir plus d'informations sur ces erreurs, je vais exécuter les commandes dans un PowerShell Essayez de capturer bloquer.

|__+_|

Notre première tâche consiste à déterminer les types d'erreur renvoyés par les commandes. Pour obtenir ces informations, exécutez les commandes ci-dessous…

|__+_|

Voici les résultats des commandes…

Comment utiliser PowerShell Try Catch pour exporter les erreurs Get-WMIObject avec Export-csvLes erreurs enregistrées dans la variable automatique $error sont stockées dans un tableau PowerShell. Chaque objet du tableau est accessible en ajoutant un [0], [1] à la fin du tableau. 0 représente le premier élément du tableau tandis que 1 représente le deuxième élément et ainsi de suite.

Retour à obtenir plus d'informations sur les erreurs générées par le Get-Childitem commande, en fonction des types d'erreurs, nous pouvons modifier notre bloc Try Catch pour capturer ces 2 types d'erreurs…

|__+_|

Notre deuxième tâche consiste à afficher les messages d'erreur réels. Cette commande fera le travail :

|__+_|

La commande affiche les deux messages d'erreur…

Comment utiliser PowerShell Essayez de capturer Pour exporter les erreurs Get-WMIObject avec Export-csv

Dans cette sous-section, j'exporterai les erreurs générées lors de l'exécution Get-WMIObject sur un ordinateur distant dans un fichier CSV avec le Exporter-csv commander.

Voyons d'abord les détails de l'erreur générée lorsque vous essayez de vous connecter à un ordinateur distant hors ligne avec Get-WMIObject . Pour illustrer cela, exécutez la commande ci-dessous…

|__+_|

La commande a généré un message d'erreur car L'ordinateur n'est pas un nom de PC valide.

Comment détecter les erreurs Get-Process avec l'instruction PowerShell Try Catch

Passant à autre chose, pour gérer l'erreur, je vais exécuter la commande dans le Essayer bloc d'un Essayez de capturer déclaration.

|__+_|

Dans la première ligne du Essayer block, j'ai défini la variable $ComputerName. Puis, en deuxième ligne, j'ai couru le Get-WmiObject commander.

Par ailleurs, dans le Prise bloc, j'ai créé les détails de l'erreur exportés vers un fichier CSV avec Exporter-csv .

Voici une explication détaillée du script dans le Essayer bloquer:

  1. À la ligne 1, j'ai créé une variable $path qui spécifie où je veux enregistrer le fichier CSV
  2. Ensuite, à la ligne 2, j'ai utilisé la commande Get-Date pour créer un nom de fichier pour le fichier CSV. Le nom du fichier est au format, aaaaMMjj_HHmmss.csv
  3. À la ligne 3, j'ai créé un objet vide enregistré dans une variable appelée $ data
  4. Ensuite, à la ligne 4, j'ai ajouté la colonne 'Nom de l'ordinateur' dans l'objet que j'ai créé à la ligne 3. La colonne prend la variable $ComputerName
  5. A la ligne 5, j'ai ajouté le volume 'Message d'erreur' qui enregistrera les messages d'erreur, $error.Exception.Message
  6. Ensuite, à la ligne 6, j'ai créé une variable $csvfilepath qui combine les variables $path et $csvfilename pour créer un chemin complet vers le fichier CSV
  7. Enfin, à la ligne 7, j'ai canalisé les informations enregistrées dans la variable $data ($ComputerName et $error.Exception.Message) dans Exporter-csv et enregistré le fichier dans $csvfilepath
le Aucune information sur le type Le paramètre dans la commande Export-csv supprime les informations de type. Pour en savoir plus, lisez notre guide, Powershell NoTypeInformation : Applications et exemples

La capture d'écran ci-dessous montre le CSV créé par le script…

Comment détecter les erreurs Get-Process avec PowerShell Essayez de capturer Déclaration

Si vous exécutez la commande Get-Process avec un ID de processus qui n'existe pas, elle renverra un Microsoft.PowerShell.Commands.ProcessCommandExceptionMicrosoft.PowerShell.Commands.ProcessCommandException Erreur.

Pour capturer ce type d'exception spécifique, exécutez une commande similaire à celle ci-dessous :

|__+_|

Voici le résultat du script dans PowerShell ISE.

Alternativement, vous pouvez définir un message d'erreur personnalisé en modifiant le script comme indiqué ci-dessous…

|__+_|

Maintenant, le script renvoie le message d'erreur personnalisé…

Comment détecter les erreurs Get-Mailbox avec PowerShell Essayez de capturer Déclaration

Si vous vous connectez à Office 365 PowerShell et exécutez le Get-Mailbox contre un utilisateur qui n'existe pas, vous obtiendrez un message d'erreur. Certains utilisateurs ont signalé des problèmes pour capturer le message d'erreur dans Get-Mailbox commander.

Pour tester ce scénario, après vous être connecté à notre Compte Office 365 via PowerShell, j'ai exécuté le script ci-dessous:

|__+_| L'utilisateur Pius n'existe pas dans notre compte Office 365.

Le script a renvoyé le message d'erreur L'opération n'a pas pu être effectuée car l'objet 'Pius' est introuvable sur 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.

Voici la capture d'écran…

Toutefois, si Essayez de capturer attrape l'erreur, essayez d'ajouter le type d'exception comme indiqué dans la commande modifiée ci-dessous :

|__+_|

C'est tout - notre guide complet et mis à jour sur PowerShell Essayez d'attraper la finale ment! J'espère que vous l'avez trouvé utile?

Si vous l'avez trouvé utile, merci de voter Oui à la question Was this post Helpful ci-dessous.

Alternativement, vous pouvez poser une question, laisser un commentaire ou fournir plus de commentaires avec le formulaire Laisser une réponse qui se trouve à la fin de cette page.

Enfin, pour plus de zones S techniques PowerShell, visitez notre page de guide pratique Windows PowerShell. Vous pouvez également trouver notre page Travail à domicile très utile.

Références et lectures complémentaires

  1. À propos d'Essayer Attraper enfin
  2. À propos du piège
  3. PowerShell Array et Add to Array : Applications et exemples
  4. Explication de Powershell For Loop : syntaxe et exemples