Introduction à la gestion des erreurs dans PowerShell
Beaucoup de scripts PowerShell sont conçus pour s’exécuter sans assistance. Il est donc vital de s’assurer que les erreurs sont traitées sans anicroche. Une bonne gestion des erreurs participe à prévenir un large éventail de problèmes – de l’exécution incomplète et l’interruptions de service à la perte de données. La gestion des erreurs doit tenir compte des erreurs bloquantes (terminating), qui interrompent l’exécution du script, et des non bloquantes (non-terminating), qui laissent le script s’exécuter mais peuvent affecter le résultat.
Un des mécanismes les plus utiles pour gérer les erreurs dans PowerShell est le bloc Try-Catch-Finally. Le bloc Try contient le code susceptible d’entraîner une exception. Dans ce cas, le contrôle passe au bloc Catch, qui gère l’erreur par des actions, comme celle d’ignorer le fichier problématique ou la valeur incorrect en entrée, et enregistre l’événement. Le bloc Finally, toujours exécuté, remet de l’ordre : il ferme les fichiers, libère les ressources ou enregistre des informations. Par exemple, des messages d’erreur ciselés pour Try Catch dans PowerShell devraient vous permettre d’agir en conséquence pour résoudre les problèmes.
Nous allons explorer ici en profondeur les blocs Try-Catch-Finally. Nous couvrirons au passage d’autres méthodes de gestion des erreurs dans PowerShell, notamment avec le paramètre ErrorAction pour contrôler la réponse des cmdlets aux erreurs et avec la variable $Error pour stocker l’historique des erreurs.
Dans PowerShell, qu’est-ce qu’une erreur ?
Les erreurs sont des événements susceptibles d’affecter le déroulé normal de l’exécution d’un script voire de l’interrompre. Elles sont couramment causées par des erreurs de syntaxe, des fichiers manquants, des permissions insuffisantes ou des ressources indisponibles. Il existe deux grands types d’erreurs : bloquantes et non bloquantes.
Erreurs bloquantes : critiques, elles interrompent le script
Des erreurs bloquantes arrêtent immédiatement l’exécution du script à moins d’être géré comme il faut. Elles se produisent quand PowerShell rencontre un problème qui l’empêche d’aller plus loin comme une erreur de syntaxe, l’appel d’une variable ou d’un fichier inexistants, ou des permissions insuffisantes pour réaliser l’opération demandée.
Par exemple, le script ci-dessous tente d’obtenir le fichier users. txt :
Get-Content C:\users.txt | Get-ADUser -Properties name | Select-Object -Property SamAccountName,name
Si ce fichier n’existe pas à l’emplacement désigné ou que le compte exécutant le script ne dispose pas des autorisations pour y accéder, ce script produira une erreur bloquante mettant un terme à ses opérations comme montré ici :

Erreurs non bloquantes : le script poursuit son exécution
Les erreurs non bloquantes dans PowerShell n’entraînent pas l’arrêt de l’exécution du script. Elles trouvent souvent leur source dans des cmdlets qui tentent de traiter plusieurs objets et que l’échec d’un des traitements n’entraîne pas obligatoirement l’arrêt du script dans son ensemble.
Prenons l’hypothèse que nous exécutons le script de l’exemple précédent, mais que le fichier existe et que nous avons les permissions pour y accéder. Mais il nous manque la connexion à un contrôleur de domaine. Dans ce cas, la première commande s’exécute et récupère le contenu du fichier. Toutefois la commande suivante échoue et entraîne une erreur non bloquante pour chacun des trois objets du fichier.

Supposons maintenant que la connectivité au contrôleur de domaine est restaurée, mais que le nom d’utilisateur ’un des objets du fichier n’est pas valide. L’exécution du script produira l’erreur non bloquante affichée ci-dessous pour cet objet, mais traitera les deux autres.

Emplacement de stockage des erreurs : la variable $Error
$Error constitue automatiquement un tableau des erreurs récentes rencontrées pendant l’exécution du script, un outil particulièrement utile pour le débogage ou le dépannage. L’erreur la plus récente est stockée à l’indexation [0].
Par exemple, quand le script suivant tente de récupérer un fichier inexistant, il récupère l’erreur suivante dans $Error et l’affiche avec un message intelligible :
# trying to get a file which doesn't exist, and an error is generated. Get-Item "C:\file44.txt" # Display a message along with the last error. Write-Host "Oops! Something went wrong Here's the error: $($Error[0])"

Implémenter les blocs Try-Catch-Finally est un bon moyen de gérer aisément les erreurs.
Bloc Try : où le code peut contenir des erreurs
Ce bloc Try contient du code susceptible de produire une erreur. Par exemple, le script suivant est conçu pour arrêter le processus du Bloc-notes. Si ce processus est en cours d’exécution, le bloc Try l’arrêtera ; mais dans le cas contraire, l’exécution passera au bloc Catch, ce qui empêchera le script de planter.
try { # Attempt to stop a process that may not be running Stop-Process -Name "Notepad" -ErrorAction Stop # If no error occurs, this line will execute Write-Host "Notepad process stopped successfully." } catch { # Handle the error gracefully Write-Host "Oops! Could not stop the process. Error: $($_.Exception.Message)" }

Bloc Catch : gérer les erreurs lorsqu’elles se produisent
Le bloc Catch sert à gérer les exceptions qui se produisent dans le bloc Try. Dans l’exemple suivant Try Catch, le script invite l’utilisateur à saisir un nombre, puis le divise par 10 et imprime le résultat. Toutefois si le chiffre en entrée est 0, la tentative de division produit une erreur puisqu’il est impossible de diviser par zéro. Dans ce cas, le bloc Catch s’exécute et imprime un message d’erreur au lieu d’un nombre.
try { $number = [int](Read-Host "Enter a number") Write-Output "Result: $(10 / $number)" } catch { Write-Output "Error: Invalid input or division by zero!" } finally { Write-Output "Program execution completed." }

Bloc Finally : code qui s’exécute dans tous les cas
Le bloc Finally s’exécute toujours qu’une exception se soit produite ou pas.
Par exemple, le script suivant définit un tableau composé de trois éléments seulement, mais tente d’imprimer le cinquième ; cette exception est gérée dans le bloc Catch, ce qui imprime une erreur. Toutefois le bloc Finally s’exécute lui aussi, ce qui entraîne l’impression d’un message supplémentaire.
try { # Define an array $numbers = @(1, 2, 3) # Access an invalid index using a .NET method that throws an exception $value = $numbers.GetValue(5) Write-Host "Value: $value" } catch [System.IndexOutOfRangeException] { # Handle the specific exception Write-Host "Error: Index out of range exception caught." } finally { # This block always executes Write-Host "Execution completed." }

Exemple avancé : utiliser différents blocs Catch selon les types d’exception
Un script peut comprendre plusieurs blocs Catch qui gèrent différents types d’exceptions pour une gestion des erreurs plus granulaire. Ainsi, le framework .Net offre un ensemble bien fourni de types de messages pour les exceptions Try Catch de PowerShell, notamment :
- System.DivideByZeroException – en cas de tentative de division par zéro.
- System.FormatException – en cas de tentative de conversion en nombre d’une entrée non numérique.
- System.ArgumentNullException – quand un des arguments transférés est nul alors qu’il ne doit jamais l’être.
- System.IO.IOException – en cas d’erreur d’entrée/sortie.
Par exemple, le script suivant demande à l’utilisateur de saisir deux nombres, puis il les convertit en entiers, il divise ensuite le premier par le second et imprime le résultat. Le premier bloc Catch gère la possibilité que l’entrée de l’utilisateur soit impossible à convertir en entier ; et le second, une tentative de division par zéro.
try { # Prompt user for first input $num1 = Read-Host "Enter the first number" $num1 = [int]$num1 # Convert to integer (may cause FormatException) # Prompt user for second input $num2 = Read-Host "Enter the second number" $num2 = [int]$num2 # Convert to integer (may cause FormatException) # Perform division (may cause DivideByZeroException) $result = $num1 / $num2 # Print result Write-Host "Result: $result" } catch [System.FormatException] { # Handling invalid input error Write-Host "Error: Please enter only numeric values!" } catch [System.DivideByZeroException] { # Handling division by zero error Write-Host "Error: Cannot divide by zero!" } catch { # Handling unexpected errors Write-Host "An unexpected error occurred: $_" } finally { # Code that always runs Write-Host "Execution completed." }

Techniques de gestion des erreurs avancées
Pour créer des scripts plus robustes et à la maintenance plus facile, pensez à utiliser les techniques de gestion des erreurs suivantes en plus des blocs PowerShell Try and Catch.
- Utilisez $ErrorActionPreference = ‘Stop’ pour vous assurer que toutes les erreurs sont traitées comme bloquantes, ce qui en facilite le repérage.
- Utilisez -ErrorAction Stop sur des commandes individuelles pour un contrôle plus granulaire sans incidence sur l’ensemble du script.
- Utilisez $_.Exception.Message et $PSItem pour accéder aux détails des erreur.
Capturer des exceptions spécifiques
Le script suivant vise à convertir l’entrée de l’utilisateur en un entier, puis à exécuter une commande. Le premier bloc Catch gère la possibilité d’une saisie incorrecte de l’utilisateur ; et le second, les tentatives d’exécuter une commande invalide. Si une des deux exceptions se produit, le script imprime un message personnalisé.
try { # Attempt to convert user input to an integer (may throw FormatException) $number = Read-Host "Enter a number" $number = [int]$number # Try running a non-existent command (may throw CommandNotFoundException) NonExistent-Command } catch [System.FormatException] { Write-Host "Error: Invalid input. Please enter a valid number." } catch [System.Management.Automation.CommandNotFoundException] { Write-Host "Error: Command not found. Please check the command name." } catch { Write-Host "An unexpected error occurred: $_" } finally { Write-Host "Execution completed." }

Accéder aux détails des erreurs avec $_.Exception.Message et $PSItem
Pour accéder au détail des erreurs dans un bloc Catch, utilisez une des variables suivantes :
- $_.Exception.Message produit un message d’erreur Try Catch PowerShell clair et intelligible ne contenant que la partie pertinente de l’erreur.
- $PSItem contient tout l’objet erreur, notamment le type d’erreur, la source et l’arborescence des appels de procédure.
Le script suivant illustre la différence de sortie de ces différentes variables :
try { # Attempt to open a non-existent file Get-Content "C:\File1.txt" -ErrorAction Stop } catch { # Using $_.Exception.Message to get detailed error information Write-Host "Error occurred: $($_.Exception.Message)" # Using $PSItem (same as $_) to display full error details Write-Host "Full Error Details: $PSItem" } finally { Write-Host "Execution completed." }

Utiliser des instructions Trap
Une instruction Trap définit le code exécuté quand une erreur précise se produit où que ce soit dans le script. Elle fournit ainsi un mécanisme de gestion des erreurs à plus haut niveau que les blocs individuels Try-Catch de PowerShell.
Le script suivant utilise Try-Catch dans PowerShell pour gérer la possibilité d’une tentative de division par zéro. L’instruction Trap capturera toute autre erreur qui pourrait se produire soit, dans notre cas, l’utilisation de la cmdlet Get-Item avec un fichier inexistant.
# Global error handler using trap trap { Write-Host "Global Error Handler (trap): $_" continue # Allows the script to continue execution } function Test-TryCatch { try { Write-Host "Inside Try Block" 1 / 0 # This will cause a division by zero error Write-Host "This line will not execute due to the error above." } catch { Write-Host "Caught in Try-Catch: $_" } } Write-Host "Before function call" Test-TryCatch Write-Host "After function call" # Triggering another error outside try-catch to see if trap works Write-Host "Triggering an error outside Try-Catch" Get-Item "C:\NonExistentFile.txt" -ErrorAction Stop # Force a terminating error Write-Host "Script completed"

Gestion des erreurs non bloquantes dans PowerShell
Les blocs Catch sont conçus pour gérer les erreurs bloquantes. Comme les erreurs non bloquantes n’interrompent pas l’exécution du script, elles ne déclenchent pas de blocs Catch. Toutefois, nous pouvons convertir des erreurs non bloquantes en bloquantes à l’aide du paramètre -ErrorAction Stop. Ce paramètre force le script à traiter une erreur non bloquante comme une bloquante, ce qui permet au bloc Catch de la gérer de manière appropriée.
Supposons que nous exécutions le script suivant, mais que le dossier auquel il tente d’accéder n’existe pas. Le bloc Try utilise -ErrorAction Stop pour convertir cette erreur non bloquante en bloquante afin qu’elle soit gérée par le bloc Catch.
$directoryPath = "C:\NonExistentFolder" try { Write-Host "Checking if directory exists..." Get-ChildItem -Path $directoryPath -ErrorAction Stop # Force a terminating error if the directory doesn't exist Write-Host "Directory found." } catch { Write-Host "Error: The directory '$directoryPath' was not found." }

Recommandations pour utiliser Try-Catch dans PowerShell
Pour une clarté, une efficacité et une maintenabilité maximales de votre code, élaborez méticuleusement votre bloc de gestion des erreurs. Notez que Try-Catch dans PowerShell ne doit servir qu’aux véritables exceptions. Restreindre le code du bloc Try aux seules opérations susceptibles de produire une exception permet d’en identifier plus aisément la source et facilite le débogage du script. Dans les autres cas, utilisez plutôt les instructions if-else ou switch.
Les bonnes pratiques incluent aussi de :
- S’assurer que le code à l’intérieur du bloc Try suit le principe de responsabilité unique, à savoir que chaque morceau de code exécute une tâche précise.
- Utiliser des blocs Catch distincts pour gérer différents types d’exceptions.
- Toujours inclure un bloc Finally pour nettoyer le code et libérer les ressources.
Le script suivant illustre certaines de ces bonnes pratiques. Il utilise une instruction if avec test-path pour vérifier si un fichier existe avant de tenter d’y accéder. En l’absence de celui-ci, l’erreur est affichée grâce à l’instruction else. Le bloc Try-Catch sert uniquement à lire le contenu du fichier ; si le script rencontre une erreur comme un défaut de permission, le bloc gère l’exception et affiche un message d’erreur.
# Define the path to the file $filePath = "D:\NonExistentFile.txt" # Check if the file exists if (Test-Path -Path $filePath) { try { # Try to read the file contents $fileContents = Get-Content -Path $filePath -ErrorAction Stop Write-Host "File contents: $fileContents" } catch { # Handle any exceptions that occur while reading the file Write-Host "Error: Unable to read the file. Exception Message: $_" } } else { # If the file does not exist, display an error message Write-Host "Error: The file does not exist." }

PowerShell Try-Catch et poursuite du script
Utiliser des instructions Continue
Quand un script rencontre une erreur dans un bloc Try-Catch, son comportement par défaut est de gérer l’exception du bloc Catch et d’arrêter de s’exécuter. Toutefois, dans certains scénarios nous voulons poursuivre l’exécution après que l’erreur a été gérée, par exemple dans le cas de traitement de fichiers par lots ou de tests de connexion vers plusieurs serveurs.
Pour éviter qu’un seul échec interrompe toute l’itération, utilisez l’instruction Continue. Par exemple, le script suivant teste la connexion de plusieurs serveurs ; l’instruction continue garantit que l’exécution se poursuit même après qu’une erreur s’est produite sur un serveur.
# List of server names (replace with actual server names or IPs) $servers = @("lhehost9", "lhehost11", "lhehost10") foreach ($server in $servers) { try { Write-Host "Attempting to connect to $server..." # Simulating a remote connection (Replace with actual connection command) Test-Connection -ComputerName $server -Count 2 -ErrorAction Stop Write-Host "Successfully connected to $server.`n" } catch { Write-Host "Error: Failed to connect to $server. Skipping to next server...`n" continue # Continue to the next server in the loop } } Write-Host "Script execution completed."

Utiliser la variable $ErrorActionPreference
Une autre façon de forcer le script à s’exécuter après une erreur est d’utiliser la variable $ErrorActionPreference. Si le bloc Try-Catch permet de gérer l’erreur localisée, $ErrorActionPreference est un paramètre global qui contrôle la réponse de PowerShell aux erreurs non bloquantes.
Nous avons déjà vu comment définir la préférence $ErrorActionPreference sur « Stop » pour traiter toutes les erreurs comme bloquantes et faciliter leur capture. Toutefois, cette variable a des paramètres supplémentaires, notamment Continue (par défaut), Silentlycontinue, Inquire et Ignore. Avec le paramètre de cette variable, vous pouvez définir comment les erreurs sont gérées dans l’ensemble du script.
Bloc Finally dans PowerShell : nettoyage des ressources
Comme indiqué plus haut, le bloc Finally s’exécute après les blocs Try et Catch, qu’une erreur se soit produite pendant l’exécution du script ou non. Il est souvent utilisé pour finir proprement, par exemple pour fermer les fichiers, se déconnecter et libérer les ressources.
Par exemple, le script suivant ouvre un fichier et y écrit « Hello, World! ». En cas d’erreur le bloc Catch imprimera un message. Dans tous les cas, le bloc Finally garantit que le flux de fichier est fermé pour éviter toute fuite de ressources.
try { $filePath = "D:\Office\Backup\eventviewer_logs.txt" $fileStream = [System.IO.StreamWriter]::new($filePath) $fileStream.WriteLine("Hello, World!") } catch { Write-Host "An error occurred: $_" } finally { if ($fileStream) { $fileStream.Close() Write-Host "File stream closed successfully." } }
Gestion d’erreurs multiples dans PowerShell
Variables qui stockent et comptent les erreurs
PowerShell dispose de deux variables particulièrement utiles pour l’audit et le débogage des scripts qui rencontrent plusieurs exceptions :
- $Error conserve une liste des erreurs rencontrées pendant une session.
- $Error.count fournit le nombre total des erreurs enregistrées pendant la cession courante.
Pour un suivi correct, il peut s’avérer nécessaire de nettoyer la liste des erreurs de temps en temps pendant une session. Utiliser $Error.clear() supprimera toutes les erreurs stockées.
Utiliser des blocs Try-Catch imbriqués pour gérer plusieurs erreurs
Le script suivant comprend deux blocs imbriqués Try-Catch pour gérer deux erreurs potentielles différentes – la division par 0 et l’accès à un fichier non existant :
try { Write-Host "Starting First try block..." try { Write-Host "Attempting to divide by zero..." $result = 1 / 0 # This will cause a divide-by-zero exception } catch [System.DivideByZeroException] { Write-Host "Inner catch: Division by zero error occurred" throw "Re-throwing error to outer try block" } try { Write-Host "Accessing a file that doesn't exist..." Get-Content -Path "C:\File1.txt" -ErrorAction Stop } catch [System.IO.FileNotFoundException] { Write-Host "Inner catch: File not found error occurred" } } catch { Write-Host "Outer catch: Handling an error from inner blocks - $($_.Exception.Message)" } finally { Write-Host "Executing final block for cleanup..." }

Messages d’erreur et débogage dans PowerShell
Accéder aux informations détaillées sur l’erreur
Quand des erreurs se produisent lors de l’exécution d’un script, savoir qu’une erreur s’est produite ne suffit pas. Nous avons besoin d’informations détaillées pour établir le diagnostic et résoudre le problème. Comme nous l’avons déjà noté, la variable $Error conserve un registre des erreurs, la plus récente étant $Error[0]. Parmi les propriétés des erreurs, citons Exception, CategoryInfo, InvocationInfo et ScriptStackTrace.
Extrêmement précieuse, la propriété ScriptStackTrace fournit la pile des appels détaillée et montre la séquence d’appels de fonctions et d’emplacements de scripts qui a mené à l’erreur. Pour accéder à ces informations détaillées concernant l’erreur la plus récente, utilisez $Error[0].ScriptStackTrace.
Fournir des messages d’erreur personnaliséss
Afficher des messages d’erreur utiles et facile à comprendre améliore l’ergonomie et le débogage du script. Des messages personnalisés peuvent informer les utilisateurs de ce qui s’est mal passé et les aider à corriger l’erreur, par exemple à rectifier le chemin d’un fichier, le nom d’un processus ou un défaut d’autorisation.
Pour afficher des messages sur mesure, vous pouvez utiliser Write-host ou write-error dans un bloc Catch. Incluez $_.Exception.message pour fournir des détails supplémentaires.
Par exemple, quand l’erreur (la division par zéro) se produit pendant l’exécution du script ci-dessous, une notification détaillée s’affiche sur la console et est envoyée par e-mail à l’administrateur :
$SMTPServer = "lvkex.ca.lo" $SMTPPort = 587 $From = "aadministrator@ca.lo" $To = "administrator@ca.lo" $Subject = "PowerShell Script Error Alert" try { Write-Host "Executing script..." # Simulate an error (divide by zero) $result = 1 / 0 } catch { # Capture actual error message details $ErrorMessage = @" An error occurred in the PowerShell script. Message: $($_.Exception.Message) Script: $($MyInvocation.ScriptName) Line: $($_.InvocationInfo.ScriptLineNumber) Date: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss") "@ # Log error to console and send email Write-Host "An error occurred. Sending email notification..." Send-MailMessage -SmtpServer $SMTPServer -Port $SMTPPort -From $From -To $To -Subject $Subject -Body $ErrorMessage } }

Cas d’utilisation courants pour Try-Catch dans PowerShell
Mise à jour de profil utilisateur en masse avec gestion des erreurs de saisie
Les administrateurs utilisent souvent PowerShell pour actualiser automatiquement les informations des utilisateurs dans Active Directory à partir d’un fichier csv. Comme le fichier d’entrée peut contenir des données non valides, il est important d’utiliser Try-Catch pour gérer et enregistrer les erreurs.
Le script suivant importe la liste des utilisateurs au format csv et, par itération, met à jour les descriptions dans l’AD. Il affiche les résultats sur la console et enregistre toutes les erreurs dans un journal.
# Define file paths $CsvFile = "C:\Members (7).csv" $LogFile = "C:\logs.txt" # Import CSV $Users = Import-Csv -Path $CsvFile foreach ($User in $Users) { try { # Attempt to find the user in AD using CN or SamAccountName $ADUser = Get-ADUser -LDAPFilter "(cn=$($User.cn))" -Properties SamAccountName, Description -ErrorAction SilentlyContinue if ($ADUser -eq $null) { # Log missing users $ErrorMessage = "$(Get-Date): User '$($User.cn)' not found in AD." Write-Host $ErrorMessage Add-Content -Path $LogFile -Value $ErrorMessage continue # Skip to the next user } # Define new description $NewDescription = "Test update on $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" # Update AD user description Set-ADUser -Identity $ADUser.SamAccountName -Description $NewDescription -ErrorAction Stop # Log success Write-Host "Updated: $($ADUser.SamAccountName) - New Description: $NewDescription" } catch { # Capture and log errors $ErrorMessage = "$(Get-Date): Error updating $($User.cn) ($($ADUser.SamAccountName)) - $($_.Exception.Message)" Write-Host $ErrorMessage Add-Content -Path $LogFile -Value $ErrorMessage } }

Gestion des problèmes de connexion réseau ou serveur
Les blocs Try-Catch S’avère aussi utile pour gérer les problèmes de connexion au réseau ou au serveur. Par exemple le script suivant illustre comment tester la connexion à un serveur, une fois avec le nom correct et l’autre pas :
# Define server details $Server = "ada1.adatum.local" $LogFile = "C:\log.txt" try { # Check if the server responds to a ping $PingTest = Test-NetConnection -ComputerName $Server if (-not $PingTest.PingSucceeded) { throw "Server $Server is not responding to ping." } # Check RDP connectivity (port 3389) $RDPTest = Test-NetConnection -ComputerName $Server -Port 3389 if (-not $RDPTest.TcpTestSucceeded) { throw "Server $Server is reachable but RDP port 3389 is not open." } # If both checks pass Write-Host "Server $Server is reachable, and RDP is accessible." } catch { # Capture and log the error $ErrorMessage = "$(Get-Date): Error connecting to server $Server - $($_.Exception.Message)" Write-Host $ErrorMessage Add-Content -Path $LogFile -Value $ErrorMessage }

Conclusion
Les blocs Try-Catch-Finally sont un outil extrêmement précieux pour la gestion des erreurs dans les scripts PowerShell. En les combinant avec des mécanismes comme le paramètre ErrorAction et les variables $ErrorActionPreference et $Error, vous pouvez créer des scripts robustes qui s’exécutent fluidement même en cas de problème inattendu. Vous pouvez ainsi automatiser des tâches avec l’assurance que vous ne subirez pas de problèmes tels qu’une opération incomplète, une interruption du système ou des pertes de données.
FAQ
Comment utiliser Try-Catch pour gérer à la fois les erreurs bloquantes et non bloquantes ?
Les erreurs bloquantes interrompent le déroulement normal du script et déclenchent donc automatiquement le bloc Catch, à l’inverse des non bloquantes. Pour obliger toutes les erreurs à déclencher le bloc Catch, définissez le paramètre –ErrorAction sur Stop. Par exemple, le code ci-dessous tente d’accéder à un processus qui n’existe pas. Le paramètre –ErrorAction convertit l’erreur en une erreur bloquante pour garantir son inscription dans la console :
Try { # Attempting to get a process that may not exist (non-terminating error) Get-Process -Name "NonExistentProcess" -ErrorAction Stop } Catch { Write-Host "An error occurred: $($_.Exception.Message)" }

Quelle est la différence entre Trap et Try-Catch ?
La principale différence entre Trap et Try-Catch réside dans la gestion des erreurs. Try-Catch permet de gérer des exceptions spécifiques au sein d’un segment de code précis. Trap est défini à un niveau global. Il est exécuté pour l’ensemble du script pour n’importe quel type d’erreur ; il permet au script de poursuivre son exécution sauf si une instruction Break est utilisée.
En d’autres mots, Try-Catch apporte plus de granularité dans la gestion des erreurs spécifiques, alors que Trap est utile pour capturer les erreurs qu’il n’est pas nécessaire de gérer au cas par cas.
Puis je vraiment utiliser Try-Catch pour gérer des types spécifiques d’erreurs dans PowerShell ?
Oui. Les erreurs de PowerShell sont des objets avec un abondant ensemble de propriétés. PowerShell fournit un jeu robuste d’exceptions relié à ces propriétés, ce qui peut servir à gérer les différents types d’erreurs de manière appropriée. Les exceptions courantes comprennent System.IO.FileNotFoundException, System.Net.WebException, System.UnauthorizedAccessException et System.DivideByZeroException.
Comment enregistrer efficacement les erreurs des scripts avec PowerShell ?
Dans un bloc Catch, vous pouvez enregistrer les erreurs avec des commandes comme Write-Error, Write-Warning et Write-Verbose. Pour inclure des informations pertinentes dans les messages des journaux, vous pouvez utiliser les variables $_.Exception.Message ou $_.CategoryInfo. Pour exporter les erreurs dans un fichier, utilisez les commandes Out-file et Export-Csv.
