Voglio leggere un file riga per riga in PowerShell. In particolare, voglio fare un ciclo attraverso il file, memorizzare ogni riga in una variabile nel ciclo, e fare qualche elaborazione sulla linea.
Conosco l'equivalente di Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Non c'è molta documentazione sui loop di PowerShell.
Non c'è molta documentazione sui loop di PowerShell.
La documentazione sui cicli in PowerShell è abbondante, e potresti voler controllare i seguenti argomenti di aiuto: about_For
, about_ForEach
, about_Do
, about_While
.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
Un'altra soluzione idiomatica di PowerShell al tuo problema è quella di incanalare le righe del file di testo alla cmdlet ForEach-Object
:
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
Invece di far corrispondere la regex all'interno del ciclo, si potrebbe far passare le linee attraverso Where-Object
per filtrare solo quelle a cui si è interessati:
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
ha cattive prestazioni; cerca di leggere il file in memoria tutto in una volta.
Il lettore di file C# (.NET) legge ogni riga una per una
Migliori prestazioni
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
O leggermente meno performante
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
L'istruzione foreach
sarà probabilmente leggermente più veloce di ForEach-Object
(vedere i commenti qui sotto per maggiori informazioni).