kzen.dev
  • Fragen
  • Tags
  • Benutzer
Benachrichtigungen
Belohnungen
Registrierung
Sobald Sie sich registriert haben, werden Sie über Antworten und Kommentare zu Ihren Fragen informiert.
Einloggen
Wenn Sie bereits ein Konto haben, melden Sie sich an, um neue Benachrichtigungen zu prüfen.
Es wird Belohnungen für hinzugefügte Fragen, Antworten und Kommentare geben.
Mehr
Quelle
Bearbeiten
 Kingamere
Kingamere
Frage

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.

80 2015-11-04T00:37:45+00:00 3
Peter Mortensen
Peter Mortensen
Bearbeitete Frage 19. September 2017 в 8:04
Programmierung
powershell
powershell-ise
Lösung / Antwort
Mathias  R. Jessen
Mathias R. Jessen
4. November 2015 в 1:01
2015-11-04T01:01:57+00:00
Mehr
Quelle
Bearbeiten
#29043484

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
}
Dan Atkinson
Dan Atkinson
Bearbeitete Antwort 2. September 2019 в 1:04
140
0
Kolob Canyon
Kolob Canyon
6. November 2017 в 10:35
2017-11-06T22:35:11+00:00
Mehr
Quelle
Bearbeiten
#29043485

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

Kolob Canyon
Kolob Canyon
Bearbeitete Antwort 7. Juni 2019 в 6:19
44
0
 js2010
js2010
2. September 2019 в 1:23
2019-09-02T13:23:49+00:00
Mehr
Quelle
Bearbeiten
#29043486

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
0
0
Frage hinzufügen
Kategorien
Alle
Technologie
Kultur/Erholung
Leben/Kunst
Wissenschaft
Professionell
Unternehmen
Benutzer
Alle
Neu
Beliebt
1
Роман Азаров
Registriert vor 1 Woche
2
Mansur Zakirov
Registriert vor 1 Woche
3
Тагир Мамедов
Registriert vor 1 Woche
4
Алексей Толманов
Registriert vor 1 Woche
5
Valeriu Vodnicear
Registriert vor 3 Wochen
DA
DE
EL
ES
FR
ID
IT
JA
NL
PT
RU
TR
UK
ZH
© kzen.dev 2023
Quelle
stackoverflow.com
unter Lizenz cc by-sa 3.0 mit Attribut