Saya ingin membaca file baris demi baris di PowerShell. Secara khusus, saya ingin mengulang melalui file, menyimpan setiap baris dalam variabel dalam loop, dan melakukan beberapa pemrosesan pada baris tersebut.
Saya tahu padanan Bash:
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
Tidak banyak dokumentasi tentang loop PowerShell.
powershell
powershell-ise
Kingamere
sumber
sumber
Get-Content
memuat seluruh file ke dalam memori sekaligus, yang akan gagal atau macet pada file besar.process
blok, dan mengeluarkan objek lain per baris ke dalam pipa, maka fungsi itu adalah masalahnya. Masalah apa pun dengan memuat konten lengkap ke dalam memori bukanlah kesalahannyaGet-Content
.foreach($line in Get-Content .\file.txt)
Ini akan memuat seluruh file ke dalam memori sebelum mulai iterasi. Jika Anda tidak percaya, dapatkan file log 1GB dan coba.Get-Content .\file.txt | ForEach-Object -Process {}
sadar pipeline, dan tidak akan memuat seluruh file ke dalam memori. Secara default Get-Content akan melewatkan satu baris pada satu waktu melalui pipeline.Jawaban:
Dokumentasi pada loop dalam PowerShell berlimpah, dan Anda mungkin ingin memeriksa bantuan topik berikut:
about_For
,about_ForEach
,about_Do
,about_While
.Solusi PowerShell idiomatik lain untuk masalah Anda adalah menyalurkan baris file teks ke
ForEach-Object
cmdlet :Alih-alih mencocokkan ekspresi reguler di dalam loop, Anda dapat menyalurkan garis
Where-Object
untuk memfilter hanya yang Anda minati:sumber
docs.microsoft.com
.Get-Content
berkinerja buruk; itu mencoba untuk membaca file ke dalam memori sekaligus.Pembaca file C # (.NET) membaca setiap baris satu per satu
Performace Terbaik
Atau kurang berkinerja
The
foreach
pernyataan kemungkinan akan sedikit lebih cepat daripadaForEach-Object
(lihat komentar di bawah ini untuk informasi lebih lanjut).sumber
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object { ... }
. Theforeach
pernyataan akan memuat seluruh koleksi ke objek .ForEach-Object
menggunakan pipa untuk melakukan streaming. Sekarangforeach
pernyataan itu kemungkinan akan sedikit lebih cepat daripadaForEach-Object
perintah, tetapi itu karena memuat semuanya ke memori biasanya lebih cepat.Get-Content
masih buruk.foreach()
adalah alias dariForeach-Object
foreach
adalah pernyataan, sepertiif
,for
, atauwhile
.ForEach-Object
adalah perintah, sepertiGet-ChildItem
. Ada juga alias defaultforeach
untukForEach-Object
, tetapi hanya digunakan jika ada pipeline. Lihat penjelasan panjangnya diGet-Help about_Foreach
, atau klik tautan di komentar saya sebelumnya yang mengarah ke seluruh artikel oleh Microsoft's The Scripting Guys tentang perbedaan antara pernyataan dan perintah.Get-Alias foreach
=>Foreach-Object
, tetapi Anda benar, ada perbedaan$line
ke$_
dalam blok skrip loop.Sakelar mahakuasa bekerja dengan baik di sini:
Keluaran:
sumber