Θέλω να διαβάσω ένα αρχείο γραμμή προς γραμμή στο 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
}
Το 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
(δείτε τα σχόλια παρακάτω για περισσότερες πληροφορίες).