Comme son nom l'indique, PowerShell est beaucoup plus puissant que l'invite de commande Windows standard. Avec ce pouvoir vient une plus grande possibilité d'erreurs confuses. Si votre script échoue soudainement, vous ne savez peut-être pas par où commencer pour rechercher ce qui ne va pas. C'est là que la gestion des erreurs de PowerShell est utile.
Si vous connaissez d'autres langages, vous connaissez probablement les bases de la gestion des erreurs, mais vous devrez connaître certains aspects spécifiques à PowerShell. La gestion des erreurs dans PowerShell comporte quatre parties :le paramètre d'action d'erreur, les blocs Try/Catch, le paramètre de variable d'erreur et la journalisation.
La première étape de la gestion des erreurs PowerShell consiste à traiter quelque chose qui arrête votre script dans son élan. Si l'échec n'affecte pas le reste de votre script, il peut être préférable de simplement dire à PowerShell d'ignorer les erreurs et de passer à autre chose.
D'un autre côté, il n'est pas toujours clair quand une applet de commande donnée génère une erreur de fin. Certaines applets de commande renvoient une erreur mais n'arrêtent pas votre script. Cela pourrait vous laisser attendre que votre script se termine alors qu'il produit des absurdités.
C'est là que le -ErrorAction Le paramètre entre en jeu. Vous l'utilisez pour forcer une applet de commande à gérer l'erreur comme vous le souhaitez. Si vous modifiez un script existant, vous l'ajoutez à la fin de la ligne de l'applet de commande.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Évidemment, si vous utilisez le Get-ChildItem applet de commande seule, cette erreur ne fait pas grand-chose pour vous. Cependant, si vous voulez faire quoi que ce soit avec les données, il serait bon d'arrêter le script, afin que vous sachiez que la recherche a échoué et pourquoi. Sinon, si vous effectuez plusieurs recherches, modifiez le paramètre de Stop pour Continuer Silencieusement , ainsi le script continue si une recherche échoue. Si vous voulez voir quelle est l'erreur, vous pouvez utiliser Continuer 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 modifier en Inquire . Lorsque votre applet de commande rencontre un problème, elle propose des options :Oui ,Oui pour tous , Commande d'arrêt , Suspendre , ouAide .
Cette option est un peu plus flexible mais signifie que les erreurs obligent votre script à attendre votre entrée. C'est 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.
L'action d'erreur Le paramètre résout vos erreurs de manière simple. Cependant, si vous recherchez un peu plus de contrôle sur les erreurs, PowerShell vous couvre toujours. Utiliser Essayer/Attraper , nous pouvons maintenant brancher le script lorsque les applets de commande renvoient une erreur.
Comme son nom l'indique, Try/Catch est composé de deux parties. (Techniquement, il y en a un troisième, mais nous y reviendrons dans une minute.) Le premier est le Essayer section. Vous allez exécuter votre code normal dans cette section. Vous allez toujours utiliser le -ErrorAction paramètre, mais il ne peut être défini que sur Stop . Cet indicateur garantit que votre applet de commande déclenche le Catch ---même s'il n'y a pas d'erreur de fin.
Essayez{
Get-Process "Cortana" -ErrorAction Arrêt
}
Try peut également empêcher l'exécution d'autres applets de commande si la recherche échoue. Dans ce cas, si vous envoyiez le Get-Process résultats à Stop-Process , une recherche ayant échoué empêche l'exécution de la deuxième applet de commande.
Maintenant que vous avez créé un bloc try d'applets de commande, que voulez-vous faire en cas d'échec ? Utiliser le Catch moitié, vous allez définir cela.
Attraper{
Write-Host "Processus introuvable"
}
Comme avec ErrorAction paramètre, 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.) Assurez-vous donc que vous jouez avec Try block pour créer une recherche/action dont vous avez besoin. Vous pouvez utiliser le Catch bloquer pour que votre script vous envoie un e-mail en cas d'échec.
La troisième partie est pratique si vous voulez que quelque chose s'exécute, que votre applet de commande réussisse ou non. Pour cela, vous pouvez utiliser le bouton Enfin bloquer. Vous l'ajoutez après Try and Catch et vous vous connectez lorsqu'une section de votre script se termine.
Votre script contrôle désormais 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 la -ErrorVariable paramètre les erreurs de votre cmdlet écrivent dans une variable personnalisée.
Ceci est une alternative au système $Error variable, qui contient toutes les erreurs de la session en cours.
Votre applet de commande doit être un peu plus longue. Tout d'abord, définissez une variable, quelque chose comme $SearchError fera l'affaire pour l'exemple. Lorsque vous appelez SearchError dans la ErrorVariable parmètre, vous n'utilisez pas le signe dollar.
Même si vous appelez une variable que vous avez créée, en raison du fonctionnement du paramètre, vous l'appelez sans le signe dollar. Ajoutez ensuite 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 purement et simplement. 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 d'erreur. Faites cela avec le New-Item applet de commande. Vous pouvez utiliser le Require option pour ErrorAction paramètre. Cela vous permet d'ajouter à un journal existant lorsque le Nouvel élément cmdlet échoue.
$SearchLog =New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Maintenant, lorsque vous construisez votre Try/Catch bloc, vous pouvez utiliser le Catch pour se connecter à 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.
Essayez{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Attraper{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found a renvoyé l'erreur :$SearchError"
}
Répétez cela au besoin pour toutes vos cmdlets, et vous avez maintenant un bon journal de toutes les erreurs. Si vous voulez suivre les choses qui fonctionnent avec succès, vous pouvez ajouter un Add-Content similaire à la fin de l'essai bloquer.
Cette journalisation ne s'exécute que lorsque votre Essayer cmdlet réussit. Vous pouvez ensuite enregistrer vos erreurs et réussites avec des horodatages. La journalisation vous permet désormais de savoir tout ce que votre script a fait, succès ou échec.
Bien que PowerShell soit un outil pratique pour de nombreuses tâches Windows, il peut être difficile à apprendre. Il ne convient pas non plus à tout. Si vous effectuez la maintenance du système sur votre ordinateur ou vérifiez l'intégrité d'un fichier, PowerShell est pratique. D'un autre côté, si vous cherchez à exécuter un script pour télécharger des fichiers depuis 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 sous Windows 10.