Ich möchte eine Datei Zeile für Zeile in PowerShell lesen. Insbesondere möchte ich die Datei durchlaufen, jede Zeile in einer Variablen in der Schleife speichern und einige Verarbeitungen in der Zeile durchführen.
Ich kenne das Bash-Äquivalent:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Nicht viel Dokumentation zu PowerShell-Schleifen.
process
Block angibt und pro Zeile ein anderes Objekt in die Pipeline ausspuckt, ist diese Funktion das Problem. Probleme beim Laden des gesamten Inhalts in den Speicher sind nicht die Schuld von Get-Content
.
foreach($line in Get-Content .\file.txt)
Es wird die gesamte Datei in den Speicher geladen, bevor die Iteration beginnt. Wenn Sie mir nicht glauben, holen Sie sich eine 1-GB-Protokolldatei und probieren Sie es aus.
Get-Content .\file.txt | ForEach-Object -Process {}
ist Pipeline-fähig und lädt nicht die gesamte Datei in den Speicher. Standardmäßig durchläuft Get-Content jeweils eine Zeile durch die Pipeline.
Get-Content
Lädt die gesamte Datei auf einmal in den Speicher, was bei großen Dateien fehlschlägt oder einfriert.