Comme son nom l’indique, PowerShell est beaucoup plus puissant que l’invite de commande standard de Windows. Avec cette puissance vient une plus grande possibilité d’erreurs déroutantes. Si votre script échoue soudainement, vous ne savez peut-être pas par où commencer pour chercher ce qui s’est mal passé. C’est là que la gestion des erreurs de PowerShell s’avère utile.
Si vous êtes familier avec d’autres langages, vous connaissez probablement les bases de la gestion des erreurs, mais il y a certains aspects spécifiques à PowerShell que vous devrez connaître. La gestion des erreurs dans PowerShell comporte quatre parties : le paramètre Error Action, les blocs Try/Catch, le paramètre Error Variable et la journalisation.
La gestion des erreurs PowerShell en toute simplicité
La première étape de la gestion des erreurs PowerShell consiste à traiter un élément qui arrête votre script dans sa course. Si l’échec n’affecte pas le reste de votre script, il pourrait être préférable de simplement dire à PowerShell d’ignorer les erreurs et de passer à autre chose.
D’autre part, il n’est pas toujours clair quand une cmdlet donnée lance une erreur de terminaison. Certaines cmdlets renvoient une erreur mais n’arrêtent pas votre script. Cela pourrait vous laisser attendre que votre script se termine alors qu’il sort des absurdités.
C’est là que le paramètre -ErrorAction entre en jeu. Vous l’utilisez pour forcer un cmdlet à gérer l’erreur de la façon dont vous le souhaitez. Si vous modifiez un script existant, vous l’ajoutez à la fin de la ligne du cmdlet.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Évidemment, si vous utilisez le cmdlet Get-ChildItem seul, cette erreur ne vous apporte pas grand-chose. Cependant, si vous voulez faire quelque chose avec les données, il serait bon d’arrêter le script, afin de savoir que la recherche a échoué et pourquoi. Sinon, si vous effectuez plusieurs recherches, changez le paramètre Stop en SilentlyContinue, afin que le script continue si une recherche échoue. Si vous voulez voir quelle est l’erreur, vous pouvez utiliser Continue comme paramètre à la place.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Si vous préférez avoir la possibilité de contrôler ce qui se passe à chaque exécution de votre script, vous pouvez le changer en Inquire. Lorsque votre cmdlet rencontre un accroc, il donne des options : Oui, Oui pour tous, Arrêter la commande, Suspendre ou Aide.
Cette option est un peu plus flexible mais signifie que les erreurs font que votre script attend votre entrée. C’est très bien si vous utilisez PowerShell pour envoyer un e-mail ou une autre tâche simple, mais ce n’est peut-être pas quelque chose que vous voulez lorsque vous exécutez un long processus pendant la nuit.
La gestion des erreurs PowerShell de manière puissante
Le paramètre ErrorAction traite vos erreurs de manière peu compliquée. Cependant, si vous recherchez un peu plus de contrôle sur les erreurs, PowerShell vous couvre encore. En utilisant Try/Catch, nous pouvons maintenant brancher le script lorsque les cmdlets retournent une erreur.
Comme son nom l’indique, Try/Catch est composé de deux parties. (Il y en a techniquement une troisième, mais nous y reviendrons dans une minute.) La première est la section Try. Vous allez exécuter votre code normal dans cette section. Vous allez toujours utiliser le paramètre -ErrorAction, mais il ne peut être défini que comme Stop. Ce drapeau garantit que votre cmdlet déclenche le Catch—même s’il n’a pas d’erreur terminale.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
Try peut également empêcher d’autres cmdlets de s’exécuter si la recherche échoue. Dans ce cas, si vous envoyiez les résultats de Get-Process à Stop-Process, l’échec de la recherche empêche l’exécution de la deuxième cmdlet.
Donc, maintenant que vous avez créé un bloc try de cmdlets, que voulez-vous faire quand il échoue ? En utilisant la moitié de Catch, vous allez définir ceci.
Catch{
Write-Host "Process Not Found"
}
Comme avec le paramètre ErrorAction, lorsque vous faites quelque chose d’un peu plus complexe, Catch sera utile pour plus que donner un échec en langage clair, surtout lorsque vous faites quelque chose d’un peu plus complexe. (Dans l’exemple ci-dessus, l’échec est forcé en utilisant le nom de l’application, et non le nom du processus). Veillez donc à jouer avec le bloc Try pour créer la recherche/action dont vous avez besoin. Vous pouvez utiliser le bloc Catch pour que votre script vous envoie un e-mail s’il échoue.
La troisième partie est pratique si vous voulez que quelque chose s’exécute indépendamment du fait que votre cmdlet réussisse ou non. Pour cela, vous pouvez utiliser le bloc Finally. Vous l’ajoutez après Try et Catch et enregistrez quand une section de votre script se termine.
La variable d’erreur et la journalisation
Votre script contrôle maintenant la façon dont il gère les erreurs et comment il y répond. Vous pouvez l’utiliser comme une tâche planifiée, ou au moins l’exécuter lorsque vous n’êtes pas à votre bureau. Cependant, comment pouvez-vous enquêter sur un script qui a échoué ? Avec le paramètre -ErrorVariable, les erreurs de votre cmdlet sont écrites dans une variable personnalisée.
C’est une alternative à la variable système $Error, qui contient toutes les erreurs de la session en cours.
Votre cmdlet doit devenir un peu plus long. Tout d’abord, définissez une variable, quelque chose comme $SearchError fera l’affaire pour l’exemple. Lorsque vous appelez SearchError dans le paramètre ErrorVariable, vous n’utilisez pas le signe dollar.
Même si vous appelez une variable que vous avez créée, en raison de la façon dont le paramètre fonctionne, vous l’appelez sans le signe dollar. Ensuite, ajoutez cela à la fin de la ligne.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Si vous ajoutez un + devant le nom de la variable, vous pouvez ajouter à la variable plutôt que de la remplacer carrément. Cela vous donne le même comportement que la variable d’erreur globale. Au lieu de cela, vous pouvez utiliser cette sortie et Try/Catch pour écrire une sortie personnalisée, et l’horodater.
Pour que cela fonctionne, créez un fichier texte juste après avoir défini la variable error. Faites-le à l’aide de la cmdlet New-Item. Vous pouvez utiliser l’option Inquire pour le paramètre ErrorAction. Cela vous permet d’ajouter à un journal existant lorsque le cmdlet New-Item échoue.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Maintenant, lorsque vous construisez votre bloc Try/Catch, vous pouvez utiliser le Catch pour enregistrer dans un fichier texte. Vous utilisez Get-Date pour créer l’horodatage. Le formatage peut être délicat, alors assurez-vous de le copier à partir de l’exemple.
Try{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Catch{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"
}
Répétez cela si nécessaire pour toutes vos cmdlets, et vous avez maintenant un bon journal de toutes les erreurs. Si vous voulez suivre les choses qui s’exécutent avec succès, vous pouvez ajouter un Add-Content similaire à la fin du bloc Try.
Cette journalisation ne s’exécute que lorsque votre cmdlet Try réussit. Vous pouvez alors consigner vos erreurs et vos réussites avec des horodatages. La journalisation vous permet maintenant de savoir tout ce que votre script a fait, succès ou échec.
PowerShell n’est pas votre seule option
Si PowerShell est un outil pratique pour de nombreuses tâches Windows, il peut être difficile à apprendre. Il n’est pas non plus adapté à tout. Si vous effectuez une maintenance système sur votre ordinateur ou vérifiez l’intégrité d’un fichier, PowerShell est pratique. En revanche, si vous cherchez à exécuter un script pour télécharger des fichiers sur Internet ou une tâche plus générale, vous avez d’autres options.
Par exemple, si vous venez d’un environnement Unix ou Linux, vous serez peut-être plus à l’aise avec le shell bash. Grâce au sous-système Windows pour Linux, vous pouvez désormais utiliser facilement bash et d’autres outils Linux sur votre ordinateur Windows 10. Si cela vous semble parfait, ne cherchez pas plus loin que notre guide pour faire fonctionner le shell bash sur Windows 10.
Kris Wouk est un musicien, un écrivain et tout ce qu’on appelle quand quelqu’un fait des vidéos pour le web. Passionné de technologie depuis aussi longtemps qu’il s’en souvienne, il a définitivement des systèmes d’exploitation et des appareils préférés, mais en utilise autant d’autres que possible de toute façon, juste pour rester à jour.
Plus de Kris Wouk