Je veux lire un fichier ligne par ligne dans PowerShell. Plus précisément, je veux lire le fichier en boucle, enregistrer chaque ligne dans une variable de la boucle et effectuer un traitement sur la ligne.
Je connais l'équivalent en Bash :
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Pas beaucoup de documentation sur les boucles PowerShell.
Pas beaucoup de documentation sur les boucles PowerShell.
La documentation sur les boucles dans PowerShell est abondante, et vous pouvez consulter les rubriques d'aide suivantes : about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
Une autre solution PowerShell idiomatique à votre problème consiste à transmettre les lignes du fichier texte à la cmdlet ForEach-Object
:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
Au lieu de faire correspondre les expressions dans la boucle, vous pouvez faire passer les lignes par Where-Object
pour filtrer uniquement celles qui vous intéressent :
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
a de mauvaises performances ; il essaie de lire le fichier en mémoire en une seule fois.
Le lecteur de fichiers C# (.NET) lit chaque ligne une par une
**Meilleures performances
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
Ou légèrement moins performant
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
L'instruction foreach
sera probablement légèrement plus rapide que ForEach-Object
(voir les commentaires ci-dessous pour plus d'informations).