Traitement de fichiers
Afin de pouvoir traiter les fichiers, il faut d'abord comprendre comment ils sont générés et organisés.
Objectifs
À la fin de ce chapitre, vous serez capable de :
- Créer, lire et compléter des fichiers texte avec Out-File / Get-Content / Add-Content.
- Importer et exporter des données tabulaires avec Import-CSV et Export-CSV.
- Vérifier l’existence de chemins et rechercher du contenu avec Test-Path et Select-String.
Les commandes permettant la création de fichiers sont Out-File, Set-Content et la redirection avec > ou >>.
Il y a cependant quelques différences entre ces possibilités :
- La redirection ou
Out-File, donneront un fichier tel qu'affiché dans la console, alors queSet-Contentaura comme résultat une représentation des objets. - La commande
Out-String -Streamconvertit tous les objets sous forme de chaines. Les différentes commandes :

Et les résultats :

Dans la pratique, on utilisera plutôt la redirection ou Out-File pour les fichiers textes et Set-Content pour les fichiers binaires.
La commande Out-File offre plus de possibilités avec les paramètres -Encoding (par défaut UTF-16 LE sous Windows PowerShell 5.1, et UTF-8 sous PowerShell 7+) ou -Width pour le nombre de caractères max par ligne.
De plus avec Out-File, le retour chariot (CR = Carriage Return) et le saut de ligne (LF = Line Feed) sont pris en charge.
Out-File
Cette commande permet de créer un nouveau fichier qui sera semblable au contenu de la console
Get-Service | Where-Object{$_.Status -eq "Running"} | Out-File -FilePath T:\test\services.txtGet-Content
Permet de mettre le contenu d'un fichier dans une variable de type tableau.
Le tableau sera composé des lignes du fichier et chaque ligne sera donc une chaîne de caractères.
$a=Get-Content "d:\test\toto.txt"Pour parcourir le fichier :
foreach ($line in $a)
{Write-Host $line}Le contenu de $line est aussi un tableau.
Add-Content
Permet d'ajouter une ligne dans un fichier :
$newLine = "ligne à ajouter"
Add-Content -Path "d:\truc\machin.txt" -Value $newLineInfo
A noter que Clear-Content effacera le contenu, mais pas le fichier.
Import-CSV
Rappelons d'abord qu'un fichier .csv (Comma Separated Values) est un fichier contenant des informations séparées par défaut, par des virgules... par exemple une liste extraite d'un fichier Excel.
Il est possible de choisir un autre séparateur.
Lorsque l'on utilise cette commande, le fichier sera aussi sous forme de tableau avec des cases contenant les lignes du fichier, mais en plus chaque case sera un tableau associatif des éléments du fichier.
$users= Import-CSV "x:\temp\liste-utilisateurs.csv"Un exemple d'affichage des informations d'un fichier CSV :

Export-CSV
Permet d'exporter des informations directement sous format .csv :
Get-Service | where{$_.status -eq "running"} | Export-CSV x:\test2.csv
Get-Service | where{$_.status -eq "running"} | Out-File x:\test3.csvIl faut noter que les fichiers test2.csv et test3.csv n'auront pas le même contenu.
Avec Out-File, l'affichage est simplement redirigé vers un fichier, quelle que soit son extension, alors que pour Export-CSV le fichier contient toutes les données séparées par des virgules.
Version encore plus proche de ton modèle initial :
ConvertTo-Json
Permet d’exporter des informations directement sous format .json :
Get-Service | where{$_.status -eq "running"} | Select-Object -First 3 | ConvertTo-Json
Get-Service | where{$_.status -eq "running"} | Select-Object -First 3 | Out-File x:\test4.jsonIl faut noter que les résultats obtenus n’auront pas le même contenu.
Avec Out-File, l’affichage est simplement redirigé vers un fichier, quelle que soit son extension, alors que pour ConvertTo-Json le contenu est converti en structure JSON.
Test-Path
Vérifier l'existence d'un fichier ou répertoire.
Exemple de vérification d'un répertoire :
if (Test-Path "d:\temp")
{instructions si le répertoire existe}
else
{instructions si le répertoire n'existe pas}Select-String
Permet d'extraire les phrases qui contiennent l'information recherchée.
Select-String -Path T:\test\toto.txt -Pattern "toto"Le paramètre -Quiet permet d'obtenir un booléen et -CaseSensitive pour que la recherche prenne en compte la casse.
Il est aussi possible de chercher avec une expression régulière.

Get-Date
Dans plusieurs cas, il est nécessaire d'avoir des fichiers qui ont un nom unique.
Par exemple, pour des fichiers log ou pour organiser des documents dans un dossier.
Une façon simple consiste à ajouter la date à un nom de fichier.
$date = Get-Date -Format "yyyy-MM-dd-HH-mm"
$filePath = "T:\"
$fileName = "service-spooler.txt"
Get-Service *spooler* >> "$filePath$date$fileName"Et le fichier de résultat :
Info
Noter que la commande Get-Date est utilisée avec le paramètre -Format, ce qui permet de choisir la mise en forme de la date.
Résumé
- La création/écriture de fichiers se fait via redirection, Out-File ou Set-Content selon le type.
- Les cmdlets Import-CSV / Export-CSV manipulent des objets, pas seulement du texte.
- Test-Path et Select-String sont utiles pour automatiser des contrôles et recherches.
