Lire un fichier ligne par ligne dans PowerShell

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.

Solution

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
}
Commentaires (3)

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).

Commentaires (12)

L'interrupteur tout-puissant fonctionne bien ici :

'un
deux
trois&#39 ; > fichier

$regex = '^t&#39 ;

switch -regex -file file {
  $regex { "la ligne est $_&quot ; }
}

Sortie :

la ligne est deux
la ligne est trois
Commentaires (0)