Wie man Dateien Zeile für Zeile in Windows PowerShell liest

  1. Datei zeilenweise in PowerShell lesen mit Get-Content und einer ForEach-Schleife
  2. Datei zeilenweise in PowerShell lesen mit Get-Content und Foreach-Object
  3. Verwendung der [System.IO.File]-Klasse in PowerShell zum zeilenweisen Lesen einer Datei
  4. Verwendung der System.IO.StreamReader-Klasse in PowerShell zum zeilenweisen Lesen einer Datei
  5. Fazit
Wie man Dateien Zeile für Zeile in Windows PowerShell liest

In Windows PowerShell können wir das Cmdlet Get-Content verwenden, um Dateien aus einer Datei zu lesen. Das Cmdlet lädt jedoch den gesamten Dateinhalt auf einmal in den Speicher, was bei großen Dateien fehlschlägt oder einfriert.

Um dieses Problem zu lösen, können wir die Dateien zeilenweise lesen, und dieser Artikel zeigt Ihnen, wie.

Bevor wir anfangen, ist es besser, wenn wir eine Beispieldatei mit mehreren Zeilen erstellen. Zum Beispiel habe ich eine file.txt erstellt, die die folgenden Zeilen enthält.

file.txt:

one
two
three
four
five
six
seven
eight
nine
ten

Laut Microsoft ist ein regulärer Ausdruck ein Muster, das zum Abgleichen von Text verwendet wird. Er kann aus litera len Zeichen, Operatoren und anderen Konstrukten bestehen. Dieser Artikel wird verschiedene Skripte ausprobieren, die eine Standardvariable namens reguläre Ausdrücke verwenden, die mit $regex bezeichnet wird.

Datei zeilenweise in PowerShell lesen mit Get-Content und einer ForEach-Schleife

Wir haben zunächst besprochen, dass das Cmdlet Get-Content seine Mängel hat, wenn wir eine große Datei laden, da es die Inhalte der Datei auf einmal in den Speicher lädt. Wir können dies jedoch verbessern, indem wir die Zeilen einzeln mit der foreach-Schleife laden.

Beispielcode:

foreach ($line in Get-Content .\file.txt) {
    if ($line -match $regex) {
        Write-Output $line
    }
}

Hier ist eine Schritt-für-Schritt-Erklärung des Prozesses:

  1. Dateiinhalt abrufen:

    Wir beginnen mit dem Get-Content Cmdlet, um den Inhalt der Datei zu lesen.

    Get-Content .\file.txt
    

    Ersetzen Sie "file.txt" durch den Pfad zu Ihrer Datei.

  2. Über jede Zeile iterieren:

    Als nächstes verwenden wir eine ForEach-Schleife, um über jede Zeile in der Datei zu iterieren. Die Schleife weist jeder Zeile nacheinander eine Variable $line zu.

    Innerhalb der Schleife können Sie Write-Host $line durch den Code ersetzen, der jede Zeile gemäß Ihren Anforderungen verarbeitet. In diesem Beispiel zeigen wir einfach jede Zeile mit Write-Host an, aber Sie können beliebige gewünschte Aktionen durchführen.

Datei zeilenweise in PowerShell lesen mit Get-Content und Foreach-Object

Um eine Datei zeilenweise in PowerShell mit Get-Content und Foreach-Object zu lesen, befolgen Sie diese Schritte:

  1. Verwenden Sie das Get-Content Cmdlet:

    Wir beginnen mit dem Get-Content Cmdlet, um den Inhalt der Datei zu lesen. Das Get-Content Cmdlet liest jede Zeile der Datei und gibt sie als Objekte in einer Pipeline aus.

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

Ersetzen Sie "example.txt" durch den Pfad zu Ihrer Datei.

  1. Foreach-Object-Schleife:

    Als nächstes verwenden wir das Cmdlet Foreach-Object (% ist ein Alias für Foreach-Object), um über jede Zeile in der Pipeline zu iterieren. Innerhalb des Skriptblocks (der Code innerhalb der {}) können Sie jede Zeile mit $_ verarbeiten, das die aktuelle, bearbeitete Zeile darstellt.

    powershellCopy codeGet-Content -Path "example.txt" | ForEach-Object {
        # Process each line here
        $_  # $_ represents the current line
    }
    

    Innerhalb dieser Schleife können Sie beliebige Aktionen durchführen, die Sie für jede Zeile benötigen.

Vollständiges funktionsfähiges Codebeispiel

Hier ist ein vollständiges funktionsfähiges Codebeispiel, das eine Datei zeilenweise liest und jede Zeile anzeigt:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    # Read the file line by line and process each line
    Get-Content -Path $filePath | ForEach-Object {
        # Process each line here
        Write-Host $_
    }
} else {
    Write-Host "File not found: $filePath"
}

In diesem Code:

  • Wir geben den Pfad zur Datei mit der Variablen $filePath an.
  • Wir verwenden das Cmdlet Test-Path, um zu überprüfen, ob die Datei existiert.
  • Wenn die Datei existiert, verwenden wir Get-Content, um ihren Inhalt zu lesen und ihn zur Verarbeitung an Foreach-Object weiterzugeben.
  • Innerhalb des Skriptblocks von Foreach-Object verwenden wir Write-Host $_, um jede Zeile anzuzeigen.

Verwendung der [System.IO.File]-Klasse in PowerShell zum zeilenweisen Lesen einer Datei

Um eine Datei zeilenweise in PowerShell mit der [System.IO.File]-Klasse zu lesen, befolgen Sie diese Schritte:

  1. Geben Sie den Dateipfad an:

    Beginnen Sie damit, den Pfad zur Datei anzugeben, die Sie lesen möchten. Ersetzen Sie "example.txt" durch den tatsächlichen Pfad zu Ihrer Datei.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Überprüfen Sie, ob die Datei existiert:

    Bevor Sie versuchen, die Datei zu lesen, ist es eine gute Praxis, mit dem Cmdlet Test-Path zu überprüfen, ob die Datei existiert:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  1. Lesen Sie die Datei zeilenweise:

    Sobald Sie sich vergewissert haben, dass die Datei existiert, können Sie die [System.IO.File]-Klasse verwenden, um die Datei zeilenweise zu lesen. Hier ist der Code dafür:

    powershellCopy codetry {
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
    

    In diesem Code:

    • Wir verwenden die Methode ReadLines der [System.IO.File]-Klasse, um die Datei zeilenweise zu lesen, und speichern die Zeilen in der Variablen $lines.
    • Wir verwenden dann eine foreach-Schleife, um über jede Zeile in $lines zu iterieren und sie zu verarbeiten. In diesem Beispiel zeigen wir einfach jede Zeile mit Write-Host an, aber Sie können beliebige gewünschte Aktionen durchführen.

Vollständiges funktionsfähiges Codebeispiel

Hier ist ein vollständiges funktionsfähiges Codebeispiel, das eine Datei zeilenweise liest und jede Zeile anzeigt:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Read the file line by line
        $lines = [System.IO.File]::ReadLines($filePath)
        foreach ($line in $lines) {
            # Process each line here
            Write-Host $line
        }
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

In diesem Code:

  • Wir geben den Pfad zur Datei mit der Variablen $filePath an.
  • Wir überprüfen, ob die Datei mit Test-Path existiert.
  • Wenn die Datei existiert, verwenden wir die Methode [System.IO.File]::ReadLines(), um die Datei zeilenweise zu lesen und jede Zeile mit einer foreach-Schleife zu verarbeiten.
  • Wir fügen eine Fehlerbehandlung hinzu, um eventuelle Ausnahmen während des Lesens der Datei abzufangen.

Verwendung der System.IO.StreamReader-Klasse in PowerShell zum zeilenweisen Lesen einer Datei

Um eine Datei zeilenweise in PowerShell mit der System.IO.StreamReader-Klasse zu lesen, befolgen Sie diese Schritte:

  1. Geben Sie den Dateipfad an:

    Beginnen Sie damit, den Pfad zur Datei anzugeben, die Sie lesen möchten. Ersetzen Sie "example.txt" durch den tatsächlichen Pfad zu Ihrer Datei.

    powershellCopy code
    $filePath = "example.txt"
    
  2. Überprüfen Sie, ob die Datei existiert:

    Bevor Sie versuchen, die Datei zu lesen, ist es eine gute Praxis, mit dem Cmdlet Test-Path zu überprüfen, ob die Datei existiert:

    powershellCopy codeif (Test-Path $filePath) {
        # File exists, proceed with reading
    } else {
        Write-Host "File not found: $filePath"
    }
    
  3. Lesen Sie die Datei zeilenweise:

    Sobald Sie sich vergewissert haben, dass die Datei existiert, können Sie die System.IO.StreamReader-Klasse verwenden, um die Datei zeilenweise zu lesen. Hier ist der Code dafür:

powershellCopy codetry {
    $reader = [System.IO.StreamReader]::new($filePath)
    while ($reader.Peek() -ge 0) {
        $line = $reader.ReadLine()
        # Process each line here
        Write-Host $line
    }
    $reader.Close()
} catch {
    Write-Host "Error reading the file: $_"
}

In diesem Code:

  • Wir erstellen eine neue Instanz von System.IO.StreamReader mit [System.IO.StreamReader]::new($filePath), wobei $filePath der Pfad zur Datei ist.
  • Wir verwenden eine while-Schleife, um die Datei zeilenweise zu lesen. Die Bedingung $reader.Peek() -ge 0 stellt sicher, dass wir weiter lesen, bis das Ende der Datei erreicht ist.
  • Innerhalb der Schleife verwenden wir $reader.ReadLine(), um jede Zeile zu lesen und sie nach Bedarf zu verarbeiten. In diesem Beispiel zeigen wir einfach jede Zeile mit Write-Host an, aber Sie können beliebige gewünschte Aktionen durchführen.
  • Schließlich schließen wir den StreamReader mit $reader.Close(), um die Dateiresourcen freizugeben.

Vollständiges funktionsfähiges Codebeispiel

Hier ist ein vollständiges funktionsfähiges Codebeispiel, das eine Datei zeilenweise liest und jede Zeile anzeigt:

powershellCopy code# Specify the path to the file
$filePath = "example.txt"

# Check if the file exists
if (Test-Path $filePath) {
    try {
        # Create a StreamReader to read the file
        $reader = [System.IO.StreamReader]::new($filePath)

        # Read the file line by line
        while ($reader.Peek() -ge 0) {
            $line = $reader.ReadLine()
            # Process each line here
            Write-Host $line
        }
        
        # Close the StreamReader
        $reader.Close()
    } catch {
        Write-Host "Error reading the file: $_"
    }
} else {
    Write-Host "File not found: $filePath"
}

In diesem Code:

  • Wir geben den Pfad zur Datei mit der Variablen $filePath an.
  • Wir überprüfen, ob die Datei mit Test-Path existiert.
  • Wenn die Datei existiert, erstellen wir eine Instanz von System.IO.StreamReader, um die Datei zeilenweise zu lesen und jede Zeile mit einer while-Schleife zu verarbeiten.
  • Wir fügen eine Fehlerbehandlung hinzu, um eventuelle Ausnahmen während des Lesens der Datei abzufangen.

Fazit

Zusammenfassend bietet PowerShell mehrere vielseitige Methoden zum zeilenweisen Lesen von Dateien, die unterschiedlichen Skript- und Automatisierungsbedürfnissen gerecht werden. Get-Content mit einer ForEach-Schleife ist eine benutzerfreundliche Wahl für einfache Aufgaben, die Einfachheit und Lesbarkeit bietet. Get-Content mit Foreach-Object verbessert die Flexibilität und eignet sich für komplexere Operationen und Filteraufgaben innerhalb der Pipeline.

Für Szenarien, die mehr Kontrolle und umfassende Fehlerbehandlung erfordern, bietet die [System.IO.File]-Klasse eine leistungsstarke Lösung. Diese Methode ermöglicht es Ihnen, Dateioperationen fein abzustimmen und Ausnahmen elegant zu behandeln, wodurch sie sich gut für robuste und fehlerresistente Skripte eignet.

In Situationen, in denen Sie es mit großen Dateien zu tun haben und die Speichereffizienz entscheidend ist, glänzt die System.IO.StreamReader-Klasse. Sie ermöglicht es Ihnen, Dateien effizient zu lesen, während Sie die Speichermittel effektiver verwalten und so eine reibungslose Verarbeitung umfangreicher Datensätze gewährleisten.

Letztendlich hängt die Wahl der Methode von Ihren spezifischen Skriptanforderungen, der Dateigröße und der Komplexität der Verarbeitung ab. Durch die Nutzung dieser Methoden können Sie Dateien in PowerShell zeilenweise lesen und eine Vielzahl von dateibezogenen Aufgaben in Ihren Automatisierungsabläufen effektiv angehen.

Genießen Sie unsere Tutorials? Abonnieren Sie DelftStack auf YouTube, um uns bei der Erstellung weiterer hochwertiger Videoanleitungen zu unterstützen. Abonnieren
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Verwandter Artikel - PowerShell File