Jeg vil læse en fil linje for linje i PowerShell. Jeg vil nærmere bestemt gennemløbe filen, gemme hver linje i en variabel i sløjfen og foretage en behandling af linjen.
Jeg kender Bash-ækvivalenten:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Ikke meget dokumentation om PowerShell loops.
Der er ikke meget dokumentation om PowerShell-sløjfer.
Der er masser af dokumentation om sløjfer i PowerShell, og du kan måske tjekke følgende hjælpeemner: about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
En anden idiomatisk PowerShell-løsning til dit problem er at lede linjerne i tekstfilen til ForEach-Object
cmdlet:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
I stedet for regex-matching inden for sløjfen kan du sende linjerne gennem Where-Object
for at filtrere kun dem, du er interesseret i:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
har dårlig ydeevne; den forsøger at læse filen i hukommelsen på én gang.
C# (.NET) fillæser læser hver linje en efter en
Bedste ydelse
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
Eller lidt mindre effektiv
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
foreach
-erklæringen vil sandsynligvis være lidt hurtigere end ForEach-Object
(se kommentarer nedenfor for flere oplysninger).