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