7. Gérez les erreurs et réduisez les risques
- Comprendre les erreurs PowerShell
- Sécuriser l’exécution automatique
- Ajouter Try/Catch et écrire un log d’erreurs
Fonctionnement des blocs try / catch / finally
Le mécanisme try / catch / finally permet de gérer les erreurs de manière
contrôlée et professionnelle, sans interrompre brutalement l’exécution d’un script.
Lecture du schéma
1. Le bloc try
Le bloc try contient les instructions que PowerShell tente d’exécuter.
Tant qu’aucune erreur bloquante n’est détectée, le script continue normalement.
- Une erreur non bloquante peut être affichée sans arrêter le script
- Une erreur bloquante déclenche immédiatement le bloc
catch
2. Le bloc catch
Le bloc catch est exécuté uniquement si une erreur bloquante survient
dans le try.
- Il permet de traiter l’erreur (message, log, action corrective)
- Il évite l’arrêt brutal du script
- L’erreur est accessible via
$_
3. Le bloc finally
Le bloc finally est exécuté dans tous les cas :
- si aucune erreur n’a eu lieu
- si une erreur a été traitée dans
catch
Il est utilisé pour :
- écrire un message de fin dans un log
- fermer une ressource
- afficher un état final du script
try= tentativecatch= réaction contrôlée à l’erreurfinally= nettoyage / traçabilité
Dans les chapitres précédents, nous avons :
- manipulé des fichiers et dossiers
- automatisé des actions de masse
- préparé des scripts planifiables
Sans try / catch, une simple erreur (fichier manquant, droit insuffisant)
pourrait interrompre toute l’automatisation.
La gestion d’erreurs est donc une compétence clé en exploitation.
Script défaillant (exemple)
# Exemple : chemin invalide
Get-Content "C:\chemin\inexistant.txt"
Problème : si le script est planifié, l’échec doit être tracé (log) et géré.
Version robuste : Try/Catch + log
Principe
- forcer l’erreur “terminante” :
-ErrorAction Stop - capturer l’exception :
catch - écrire dans un fichier log horodaté
Code
$logDir = "C:\tssr-powershell\logs"
New-Item -ItemType Directory -Force -Path $logDir | Out-Null
$ts = Get-Date -Format "yyyyMMdd_HHmmss"
$logFile = Join-Path $logDir "errors_$ts.log"
try {
$path = Read-Host "Chemin du fichier à lire"
$content = Get-Content $path -ErrorAction Stop
Write-Output "Lecture OK : $($content.Count) lignes"
}
catch {
$msg = $_.Exception.Message
$line = "$(Get-Date) - ERREUR - $msg"
Add-Content -Path $logFile -Value $line
Write-Output "Erreur capturée. Log : $logFile"
}