Écrire dans un fichier avec PowerShell ne consiste pas seulement à rediriger une commande : le bon choix dépend de la façon dont les données seront relues, partagées ou exploitées. Ce tutoriel PowerShell présente les méthodes essentielles, du simple fichier texte aux formats CSV, JSON et HTML, avec des exemples pour rendre la sauvegarde de données plus fiable.
L’article en bref
PowerShell propose plusieurs méthodes pour enregistrer les résultats d’un script, chacune adaptée à un usage distinct. Choisir le bon format dès le départ facilite la maintenance et la réutilisation des données.
- Écrire du texte : Choisir entre remplacement, ajout et redirection selon le besoin.
- Préserver la structure : Exporter les données tabulaires en CSV pour les réimporter.
- Échanger des objets : Utiliser JSON pour conserver des données hiérarchiques entre applications.
- Fiabiliser les scripts : Définir l’encodage, vérifier les chemins et gérer les erreurs.
À retenir : le format d’enregistrement détermine la valeur des données au-delà du script qui les produit.
PowerShell et écriture de fichiers : choisir la bonne méthode
Dans PowerShell, une commande produit généralement des objets, pas de simples lignes de texte. À la fin d’un pipeline, ces objets sont mis en forme pour l’affichage dans la console. Pour enregistrer le résultat, il faut donc décider si l’objectif est de conserver une représentation lisible ou de garder des données réutilisables.
Une équipe informatique qui collecte chaque matin l’état de ses serveurs peut, par exemple, vouloir un journal consultable par un humain ou un fichier CSV destiné à un tableau de bord. La commande utilisée dépend de cette destination : c’est le premier choix d’architecture, même pour un script court.
Rediriger une commande avec Out-File
La commande Out-File envoie la sortie d’un pipeline vers un fichier. Les opérateurs de redirection > et >> sont également disponibles dans PowerShell : le premier crée le fichier ou remplace son contenu, tandis que le second ajoute les nouvelles lignes à la fin.
Pour enregistrer les processus actifs dans un fichier, la commande Get-Process > processus.txt est équivalente à Get-Process | Out-File -FilePath processus.txt. Pour ajouter un nouveau relevé sans effacer le précédent, utilisez Get-Process | Out-File -FilePath processus.txt -Append.
Out-File enregistre une représentation textuelle mise en forme. Les informations de type et la structure des objets ne sont pas conservées : ce choix convient à un compte rendu consultable, mais moins à une importation automatisée.
Remplacer ou compléter un fichier avec Set-Content et Add-Content
La commande Set-Content remplace le contenu d’un fichier par une nouvelle valeur. La commande Add-Content, elle, ajoute du contenu à la suite de ce qui existe déjà. Ces commandes sont pratiques lorsque le script manipule directement du texte plutôt que des objets à rediriger.
Pour écrire plusieurs lignes, une chaîne multiligne peut être affectée à une variable, puis transmise à Set-Content -Path rapport.txt -Value $contenu. Pour compléter un journal, Add-Content -Path application.log -Value « Traitement terminé » évite d’écraser les entrées précédentes.
Le choix entre remplacement et ajout doit être explicite : une erreur sur ce point peut effacer un fichier utile ou faire grossir un journal sans contrôle.
Gestion des fichiers texte : encodage, lecture et journalisation
Pour relire un fichier texte, Get-Content -Path processus.txt récupère ses lignes sous forme de texte. Les objets PowerShell d’origine ne sont pas reconstitués automatiquement. Si le fichier doit alimenter un autre traitement, un format structuré sera souvent plus pertinent.
L’encodage mérite aussi une attention particulière, notamment lorsque les fichiers contiennent des accents ou circulent entre plusieurs outils. Pour définir explicitement UTF-8 avec les versions modernes de PowerShell, utilisez par exemple Out-File -FilePath rapport.txt -Encoding utf8. Dans Windows PowerShell 5.1, les valeurs par défaut diffèrent : indiquer l’encodage rend le comportement plus prévisible.
Créer un journal exploitable
Un journal utile indique quand une action a eu lieu et ce qui s’est passé. Ajouter un horodatage transforme une suite de messages en trace exploitable lors d’un diagnostic.
Exemple : $entree = « [$(Get-Date -Format ‘yyyy-MM-dd HH:mm:ss’)] Sauvegarde terminée », puis Add-Content -Path application.log -Value $entree. Dans un script destiné à tourner régulièrement, vérifiez que le dossier existe avant l’écriture et prévoyez une rotation lorsque le fichier dépasse une taille définie.
Pour des volumes importants, une écriture ligne par ligne avec StreamWriter peut offrir davantage de contrôle et limiter les opérations répétées. En contrepartie, il faut fermer correctement le flux, idéalement avec une gestion qui garantit sa fermeture même si une erreur survient.
Exportation de données PowerShell au format CSV
Le CSV convient aux données tabulaires : une ligne correspond à un enregistrement et les colonnes à des propriétés. Export-Csv transforme ainsi les objets en lignes réimportables, ce qui est plus adapté qu’Out-File pour alimenter un tableur ou un traitement ultérieur.
Pour exporter une liste de processus, utilisez Get-Process | Select-Object ProcessName, Id | Export-Csv -Path processus.csv -NoTypeInformation. La sélection des propriétés simples évite d’exporter des objets imbriqués difficiles à interpréter dans une cellule.
Import-Csv -Path processus.csv recrée des objets PowerShell à partir des en-têtes du fichier. Les valeurs importées sont généralement lues comme du texte : si un calcul numérique est nécessaire, convertissez explicitement les champs concernés.
CSV : un format simple, avec des limites précises
Le CSV facilite les échanges entre outils, mais ne représente pas naturellement les relations complexes. Une propriété qui contient elle-même un objet peut être convertie en texte peu exploitable. Sélectionner les propriétés nécessaires avant l’exportation permet de conserver un fichier clair.
Le séparateur dépend aussi des paramètres régionaux et des logiciels utilisés. Si un fichier est destiné à un tableur configuré pour le point-virgule, précisez le séparateur avec l’option correspondante d’Export-Csv, puis vérifiez le résultat dans l’application cible.
Le CSV est donc un bon choix pour des listes plates et partagées ; dès que les données sont hiérarchiques, JSON offre une représentation plus fidèle.
Sauvegarde de données structurées en JSON et HTML
JSON représente des paires clé-valeur, des tableaux et des objets imbriqués. Il est largement utilisé pour échanger des données entre scripts, services et API. En PowerShell, ConvertTo-Json prépare les objets, puis Set-Content ou Out-File écrit le résultat dans un fichier.
Pour enregistrer des processus, utilisez Get-Process | Select-Object ProcessName, Id | ConvertTo-Json | Set-Content -Path processus.json -Encoding utf8. Lorsqu’un objet comporte plusieurs niveaux d’imbrication, adaptez la profondeur avec ConvertTo-Json -Depth 5 : la profondeur par défaut peut tronquer les structures complexes.
Pour relire le fichier, Get-Content -Path processus.json -Raw | ConvertFrom-Json reconstitue les objets. L’option -Raw transmet le contenu complet en une seule chaîne, une précaution utile pour la conversion JSON, notamment avec les fichiers multilignes.
Générer un rapport HTML avec ConvertTo-Html
Pour produire un rapport consultable dans un navigateur, ConvertTo-Html transforme les objets en tableau HTML. Par exemple, Get-Service | Where-Object {$_.Status -eq « Running »} | ConvertTo-Html -Property Name, DisplayName, Status | Set-Content -Path services.html -Encoding utf8 crée un rapport limité aux services actifs.
Les options -Title et -Head permettent d’ajouter un titre et des styles CSS. Ce format est adapté à la consultation humaine, mais il ne remplace pas un format d’échange structuré lorsque les données doivent être retraitées par un autre script.
Exemples pratiques pour des scripts PowerShell fiables
Un script robuste traite les fichiers comme des ressources à protéger : il vérifie les chemins, choisit clairement entre ajout et remplacement, et signale les erreurs. Pour un inventaire, des objets personnalisés permettent de définir précisément les champs avant leur exportation.
Par exemple, un inventaire peut réunir des objets créés avec [pscustomobject]@{ Name = « PC-01 »; IPAddress = « 192.168.1.1 »; OperatingSystem = « Windows » }. Une fois la liste construite, Export-Csv convient à une vue tabulaire, tandis que ConvertTo-Json préserve mieux une éventuelle structure imbriquée.
Voici les vérifications à intégrer avant de déployer une tâche d’écriture :
- Chemin : confirmer que le dossier cible existe et que le compte dispose des droits nécessaires.
- Mode d’écriture : décider explicitement si le fichier doit être remplacé ou complété.
- Format : sélectionner TXT pour la lecture humaine, CSV pour les tableaux, JSON pour les structures hiérarchiques.
- Encodage : préciser UTF-8 lorsque le fichier doit circuler entre plusieurs environnements.
- Erreurs : utiliser try/catch avec une action configurée pour interrompre le traitement en cas d’échec.
- Volume : prévoir une rotation des journaux ou une méthode de flux pour les gros fichiers.
Un bloc try/catch peut entourer l’écriture : try { « Sauvegarde terminée » | Out-File -FilePath $chemin -Encoding utf8 -ErrorAction Stop } catch { Write-Error « Échec de l’écriture : $_ » }. Le point essentiel est de ne pas annoncer une sauvegarde réussie si l’opération a échoué.
Comparer les méthodes d’écriture de fichiers
| Méthode | Comportement | Usage adapté | Point de vigilance |
|---|---|---|---|
| Out-File | Écrit la sortie d’un pipeline sous forme de texte | Redirection et rapports lisibles | La structure des objets est perdue |
| Set-Content | Remplace le contenu du fichier | Écriture directe de texte | Le contenu existant est écrasé |
| Add-Content | Ajoute du texte à la fin du fichier | Journaux et entrées successives | Surveiller la taille du fichier |
| Export-Csv | Convertit les propriétés en colonnes | Listes tabulaires réimportables | Peu adapté aux objets imbriqués |
| ConvertTo-Json | Représente les propriétés en structure JSON | Échanges entre applications et scripts | Ajuster -Depth si nécessaire |
| StreamWriter | Écrit dans un flux avec contrôle fin | Volumes importants ou besoins spécifiques | Fermer le flux même en cas d’erreur |
La méthode la plus sophistiquée n’est pas toujours la meilleure : une écriture simple, vérifiée et adaptée au format cible est souvent plus fiable qu’une complexité prématurée.
Questions fréquentes sur PowerShell et les fichiers
Quelle commande PowerShell écrase un fichier existant ?
Set-Content remplace le contenu du fichier. Out-File et l’opérateur > écrasent également le contenu par défaut ; vérifiez le chemin avant l’exécution pour éviter une perte de données.
Comment ajouter du texte sans effacer un fichier ?
Utilisez Add-Content -Path fichier.txt -Value ‘Nouvelle ligne’, ou Out-File avec l’option -Append. Cette approche est adaptée aux journaux et aux relevés successifs.
Faut-il choisir CSV ou JSON pour exporter des données ?
CSV convient aux données tabulaires simples, faciles à ouvrir dans un tableur. JSON est préférable pour des objets imbriqués ou des échanges entre applications.
Comment éviter les problèmes d’accents dans un fichier ?
Définissez explicitement l’encodage, par exemple avec -Encoding utf8, et vérifiez le comportement attendu par les outils qui liront le fichier. Les valeurs par défaut varient selon la version de PowerShell.
Comment relire un fichier JSON dans PowerShell ?
Lisez le fichier avec Get-Content -Raw, puis transmettez son contenu à ConvertFrom-Json pour récupérer des objets PowerShell exploitables.




