Lesen einer Datei Zeile für Zeile in PowerShell

Ich möchte eine Datei Zeile für Zeile in PowerShell lesen. Genauer gesagt möchte ich eine Schleife durch die Datei ziehen, jede Zeile in einer Variablen in der Schleife speichern und die Zeile verarbeiten.

Ich kenne das Bash-Äquivalent:

while read line do
    if [[ $line =~ $regex ]]; then
          # work here
    fi
done < file.txt

Es gibt nicht viel Dokumentation über PowerShell-Schleifen.

Lösung

Es gibt nicht viel Dokumentation über PowerShell-Schleifen.

Die Dokumentation zu Schleifen in PowerShell ist sehr umfangreich, und Sie sollten sich die folgenden Hilfethemen ansehen: about_For, about_ForEach, about_Do, about_While.

foreach($line in Get-Content .\file.txt) {
    if($line -match $regex){
        # Work here
    }
}

Eine andere idiomatische PowerShell-Lösung für Ihr Problem besteht darin, die Zeilen der Textdatei über die Pipeline an das Cmdlet ForEach-Object zu übergeben:

Get-Content .\file.txt | ForEach-Object {
    if($_ -match $regex){
        # Work here
    }
}

Anstelle des Regex-Abgleichs innerhalb der Schleife könnten Sie die Zeilen durch Where-Object leiten, um nur die Zeilen herauszufiltern, an denen Sie interessiert sind:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
Kommentare (3)

Get-Content" hat eine schlechte Leistung; es versucht, die Datei auf einmal in den Speicher zu lesen.

Der C# (.NET) Dateireader liest jede Zeile einzeln ein

Beste Leistung

foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
       $line
}

Oder etwas weniger performant

[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
       $_
}

Die Anweisung foreach wird wahrscheinlich etwas schneller sein als ForEach-Object (siehe Kommentare unten für weitere Informationen).

Kommentare (12)

Der allmächtige Schalter funktioniert hier gut:

'eins
zwei
drei' > Datei

$regex = '^t'

switch -regex -file Datei {
  $regex { "Zeile ist $_" }
}

Ausgabe:

Zeile ist zwei
Zeile ist drei
Kommentare (0)