Ανάγνωση αρχείου γραμμή προς γραμμή στο PowerShell

Θέλω να διαβάσω ένα αρχείο γραμμή προς γραμμή στο PowerShell. Συγκεκριμένα, θέλω να κάνω βρόχο στο αρχείο, να αποθηκεύω κάθε γραμμή σε μια μεταβλητή στο βρόχο και να κάνω κάποια επεξεργασία στη γραμμή.

Γνωρίζω το ισοδύναμο Bash:

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

Δεν υπάρχει μεγάλη τεκμηρίωση για τους βρόχους του PowerShell.

Λύση

Δεν υπάρχει μεγάλη τεκμηρίωση για τους βρόχους PowerShell.

Η τεκμηρίωση σχετικά με τους βρόχους στο PowerShell είναι άφθονη και ίσως να θέλετε να ελέγξετε τα ακόλουθα θέματα βοήθειας: about_For, about_ForEach, about_Do, about_While.

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

Μια άλλη ιδιότυπη λύση του PowerShell στο πρόβλημά σας είναι να διοχετεύσετε τις γραμμές του αρχείου κειμένου στην εντολή [ForEach-Object (https://docs.microsoft.com/en-gb/powershell/module/Microsoft.PowerShell.Core/ForEach-Object):

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

Αντί για την αντιστοίχιση regex μέσα στο βρόχο, θα μπορούσατε να περάσετε τις γραμμές μέσω Where-Object για να φιλτράρετε μόνο αυτές που σας ενδιαφέρουν:

Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
    # Work here
}
Σχόλια (3)

Το Get-Content έχει κακή απόδοση- προσπαθεί να διαβάσει το αρχείο στη μνήμη όλα μαζί.

Ο αναγνώστης αρχείων της C# (.NET) διαβάζει κάθε γραμμή μία προς μία

Καλύτερη απόδοση

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

Ή ελαφρώς λιγότερο αποδοτική

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

Η εντολή foreach θα είναι πιθανότατα ελαφρώς ταχύτερη από την εντολή ForEach-Object (δείτε τα σχόλια παρακάτω για περισσότερες πληροφορίες).

Σχόλια (12)

Ο πανίσχυρος διακόπτης λειτουργεί καλά εδώ:

'one
two
τρία' > αρχείο

$regex = '^t&#39,

switch -regex -file file {
  $regex { "line is $_" }
}

Έξοδος:

η γραμμή είναι δύο
Η γραμμή είναι η τρίτη.
Σχόλια (0)