Memahami perulangan untuk memproses data massal: perbedaan foreach dengan ForEach-Object dan variabel otomatis $_ di pipeline, loop for dengan counter, while dan do-until untuk kondisi, pengendalian Break dan Continue, plus pertimbangan performa antara pipeline dan foreach.

Di episode 5 kalian membuat script yang mengambil keputusan: if, switch, dan teman-temannya. Tapi keputusan hanya berarti jika dijalankan atas banyak data. Di dunia nyata kalian tidak akan menulis perintah satu per satu untuk seratus file — kalian perlu mengulang. Episode ini membahas perulangan: foreach, for, while, dan do — mesin yang memproses koleksi secara massal.
Jika if adalah gerbang yang memilih jalur, loop adalah mesin konveyor yang melewatkan item satu per satu melalui gerbang itu. Gabungkan keduanya, dan kalian punya script yang memeriksa, mengubah, dan memfilter ratusan objek dalam sekejap.
Ada dua sintaks yang sekilas mirip tapi berbeda karakter. Pertama, statement foreach yang memproses seluruh koleksi:
foreach ($file in Get-ChildItem /data) {
Write-Host "Memproses $($file.Name)"
}Kedua, cmdlet ForEach-Object yang dipakai di pipeline:
Get-ChildItem /data | ForEach-Object {
Write-Host "Memproses $($_.Name)"
}Perbedaannya mendasar: foreach memuat seluruh koleksi ke memori lalu mengulang; ForEach-Object memproses setiap item saat mengalir di pipeline. Untuk koleksi kecil keduanya tidak terasa bedanya, tapi untuk jutaan item perbedaan ini menentukan.
Di dalam blok ForEach-Object, variabel $_ (atau $PSItem) menunjuk ke item yang sedang diproses. Ini variabel otomatis yang diisi oleh pipeline — kalian tidak perlu (dan tidak boleh) mengisinya sendiri.
Get-Service | ForEach-Object {
Write-Host "$($_.Name) sedang $($_.Status)"
}$_ juga sudah kalian kenal dari blok catch di konteks error handling — di sana ia menunjuk error record. Di sini ia menunjuk objek pipeline. Konsep yang sama: satu variabel otomatis yang konteksnya ditentukan oleh lingkungannya.
ForEach-Object menerima tiga blok sekaligus: -Begin dijalankan sekali sebelum item pertama, -Process untuk setiap item, dan -End sekali setelah item terakhir.
Get-Process pwsh | ForEach-Object `
-Begin { $total = 0 } `
-Process { $total += $_.WS } `
-End { Write-Host "Total memori: $total bytes" }Pola ini berguna untuk agregasi — hitung total, kumpulkan daftar, atau buka-tutup resource. -Begin menyiapkan akumulator, -Process menimbangnya, -End melaporkan hasil.
Ketika jumlah perulangan sudah diketahui, pakai for — loop klasik dengan counter:
for ($i = 0; $i -lt 5; $i++) {
Write-Host "Iterasi ke-$i"
}Tiga bagian di dalam tanda kurung: inisialisasi $i = 0, kondisi $i -lt 5, dan kenaikan $i++. Urutan eksekusi: cek kondisi, jalankan blok, naikkan counter, ulangi. Cocok untuk memproses array dengan indeks:
$nama = @("Ayu", "Budi", "Citra")
for ($i = 0; $i -lt $nama.Count; $i++) {
Write-Host "$($i + 1). $($nama[$i])"
}while mengulang selama kondisi benar, tanpa tahu kapan berhenti di awal:
$antrian = 5
while ($antrian -gt 0) {
Write-Host "Sisa antrian: $antrian"
$antrian--
}Kondisi diperiksa sebelum blok dijalankan. Jika kondisi sudah salah sejak awal, blok tidak pernah berjalan. while cocok untuk hal yang berdurasi tak tentu: menunggu service menyala, menunggu file muncul, atau polling status.
Kedua saudara while ini membalik urutan: blok dijalankan dulu, kondisi dicek setelah. Artinya blok dijamin berjalan minimal sekali.
do {
Write-Host "Mencoba koneksi..."
Start-Sleep -Seconds 2
$siap = Test-NetConnection -ComputerName server -Port 443 -InformationLevel Quiet
} while (-not $siap)do-until adalah cerminnya: mengulang sampai kondisi menjadi benar.
$i = 0
do {
$i++
} until ($i -ge 10)
Write-Host "Selesai di iterasi ke-$i"Perhatikan perbedaannya dengan while: do-while berhenti saat kondisi salah, do-until berhenti saat kondisi benar.
Tiga kata kunci mengendalikan alur di dalam loop:
break — keluar total dari loop.continue — lompat ke iterasi berikutnya, melewati sisa blok.return — keluar dari fungsi atau script tempat loop berada.for ($i = 1; $i -le 10; $i++) {
if ($i -eq 3) { continue }
if ($i -eq 8) { break }
Write-Host $i
}Hasilnya: 1, 2, 4, 5, 6, 7. Angka 3 dilewati oleh continue; saat $i mencapai 8, break menghentikan loop total.
Pertanyaan yang sering muncul: mana yang lebih cepat, foreach atau ForEach-Object?
$data = 1..100000
$start = Get-Date
foreach ($x in $data) { $null = $x }
"foreach: $( (Get-Date) - $start )"
$start = Get-Date
$data | ForEach-Object { $null = $_ }
"ForEach-Object: $( (Get-Date) - $start )"Dalam banyak kasus foreach lebih cepat karena tidak melewati overhead pipeline dan tidak membuat objek per item. Namun ForEach-Object hemat memori karena memproses streaming — tidak perlu menahan seluruh koleksi di memori.
Tip
Aturan praktis: untuk koleksi kecil hingga sedang yang sudah ada di variabel, pakai foreach. Untuk data yang mengalir dari cmdlet lain dalam pipeline, pakai ForEach-Object — dan di episode 8 kalian akan belajar -Parallel yang menjalankan iterasi secara bersamaan di PowerShell 7.
Gabungkan semuanya: script yang merangkum ukuran file besar di sebuah folder.
$folder = "/data"
$batasMb = 100
$files = Get-ChildItem $folder -File -ErrorAction SilentlyContinue
if (-not $files) {
Write-Host "Tidak ada file di $folder" -ForegroundColor Yellow
exit 1
}
$total = 0
$besar = foreach ($f in $files) {
$total += $f.Length
if ($f.Length -gt $batasMb * 1MB) { $f }
}
Write-Host "Jumlah file: $($files.Count)"
Write-Host "Total ukuran: $([math]::Round($total / 1MB, 2)) MB"
Write-Host "File di atas $batasMb MB: $($besar.Count)"Script ini memakai konsep episode ini sekaligus: foreach untuk mengumpulkan file besar, akumulasi total, dan penanganan keadaan kosong lewat if dari episode 5.
Episode 6 ini memberi kalian mesin pengulangan: foreach untuk koleksi utuh, ForEach-Object untuk pipeline dengan variabel $_, blok -Begin/-Process/-End untuk agregasi, for dengan counter untuk indeks, while untuk durasi tak tentu, do-while dan do-until yang dijamin jalan sekali, serta break, continue, dan return untuk mengendalikan alur.
Poin kunci yang dibawa pulang:
foreach memuat semua data, ForEach-Object memproses streaming — pilih sesuai ukuran data.$_ adalah item yang sedang diproses; jangan diisi manual.do-while dan do-until dijamin mengeksekusi blok minimal sekali.break menghentikan loop, continue melompat ke iterasi berikutnya.Di episode 7 kita mengemas logika perulangan dan keputusan ke dalam functions & script blocks — blok kode bernama yang bisa dipanggil, diberi parameter, dan dipakai ulang tanpa menyalin kode. Sampai jumpa di episode 7!