Fitur modern PowerShell 7: paralelisasi pipeline dengan ForEach-Object -Parallel, operator ternary dan null-coalescing, operator rantai, error view yang ringkas, serta dukungan lintas platform di Linux dan macOS.

Setelah di episode 28 kalian mengotomatisasi cloud AWS dan GCP, kini saatnya kembali ke mesin inti. Semua yang kalian pelajari sejauh ini berjalan di PowerShell — tetapi sejak versi 7, PowerShell menjadi bahasa yang lebih modern dan lintas platform. Di episode 29 ini kita membongkar fitur yang hadir atau disempurnakan di PowerShell 7: paralelisasi pipeline, operator ternary, null coalescing, operator rantai, error view yang lebih ramah, serta dukungan penuh di Linux dan macOS. Fitur-fitur ini mengubah cara kalian menulis — lebih pendek, lebih cepat, dan lebih portabel.
ForEach-Object secara tradisional memproses item satu per satu secara berurutan — antrean tunggal di loket layanan. Sejak PowerShell 7, kalian bisa membuka beberapa loket sekaligus: ForEach-Object -Parallel diikuti script block yang dijalankan untuk setiap item. Contoh nyatanya, menghitung hash banyak file:
$files = Get-ChildItem -Path /mnt/iso -Recurse -File
$files | ForEach-Object -Parallel {
$hash = Get-FileHash -Path $_.FullName -Algorithm SHA256
[PSCustomObject]@{ File = $_.FullName; Hash = $hash.Hash }
} -ThrottleLimit 4-ThrottleLimit membatasi berapa banyak loket yang dibuka bersamaan. Analogi dapur restoran: satu chef bisa memasak beberapa meja sekaligus, tetapi membuka terlalu banyak kompor justru membuat semuanya setengah matang. Atur -ThrottleLimit sesuai kemampuan mesin — memori dan CPU — bukan berdasarkan semangat.
Kekuatan paralelisme datang dengan tanggung jawab: setiap iterasi paralel berjalan di runspace terpisah, dengan variabelnya sendiri. Variabel dari scope luar tidak otomatis terlihat; untuk mengirim nilainya, kalian harus memakai awalan $using::
$baseDir = '/mnt/iso'
$files | ForEach-Object -Parallel {
$relative = $_.FullName.Substring($using:baseDir.Length + 1)
Write-Output $relative
} -ThrottleLimit 8Jika kalian menulis $baseDir tanpa $using:, nilainya kosong di dalam blok paralel — bug halus yang baru terlihat saat runtime. Aturan praktisnya: apa pun dari scope luar yang dipakai di dalam blok, awali dengan $using:.
Warning
Karena setiap runspace terisolasi, menulis ke file atau sumber daya bersama dari banyak thread bisa menabrak satu sama lain. Jika semua iterasi harus mencatat hasil ke satu file log, kumpulkan dulu hasilnya lewat pipeline lalu tulis sekali setelah blok paralel selesai — biarkan pipeline yang menyeragamkan, bukan thread.
Jika kalian pernah menulis if-else hanya untuk memilih salah satu dari dua nilai, PowerShell 7 memberi jalan pintas: operator ternary dengan bentuk kondisi ? nilai-benar : nilai-salah. Operator ini memilih nilai — bukan menjalankan blok:
$umur = 21
$kategori = $umur -ge 17 ? 'dewasa' : 'anak'
Write-Output $kategoriAnaloginya seperti rambu di percabangan jalan: satu pertanyaan, dua arah, tanpa detour. Ternary hanya untuk memilih nilai; jika kalian perlu menjalankan beberapa pernyataan sebagai respons, tetaplah memakai if biasa agar logikanya mudah dibaca.
PowerShell sering berurusan dengan nilai yang bisa kosong: variabel yang belum diisi, properti yang tidak ada, atau hasil yang gagal. Operator ?? memberikan nilai cadangan ketika sisi kiri bernilai null:
$port = $env:PORT ?? 8080
$userName = $null
$nama = $userName ?? 'guest'
Write-Output "Port $port, nama $nama"Dan ada ??= — menetapkan nilai cadangan hanya jika variabel masih null:
$config = Get-Content ./config.json -Raw | ConvertFrom-Json
$config.timeout ??= 30
Write-Output $config.timeoutSebelum ??, pola lama memaksa tiga baris if yang membosankan. Dengan ?? dan ??=, kode lebih pendek dan tujuannya langsung terbaca — kalian tidak perlu lagi menebak-nebak apakah variabel sudah terisi.
Beberapa perintah harus berjalan berurutan, dan hanya lanjut jika perintah sebelumnya sukses. Shell Unix sudah lama punya && dan ||; PowerShell 7 akhirnya memilikinya juga:
dotnet build ./app && dotnet test ./app
./deploy.ps1 -Environment staging || ./rollback.ps1&& menjalankan perintah kanan hanya jika perintah kiri berhasil; || menjalankan perintah kanan hanya jika perintah kiri gagal. Ini ringkas untuk alur build-lalu-uji dan coba-atau-gagal. Untuk keputusan yang lebih kompleks, tetaplah memakai if eksplisit — singkatan yang baik membantu, bukan menyembunyikan logika.
Sejak PowerShell 7, pesan error dirender dengan format baru bernama ConciseView — lebih pendek, penyebab dan lokasi dipisah dengan jelas, dan hanya bagian yang relevan yang ditonjolkan. Yang terbiasa dengan format lama mengenalnya sebagai NormalView. Keduanya dipilih lewat variabel preferensi $ErrorView:
$ErrorView = 'ConciseView'
$ErrorView = 'NormalView'Gunakan ConciseView untuk terminal yang cepat dibaca, dan NormalView saat kalian butuh detail lengkap untuk debugging. Pengaturan ini bisa ditulis ke profil kalian agar berlaku di setiap sesi.
PowerShell 7 bukan lagi milik Windows. Versi modern dibangun di atas .NET dan berjalan penuh di Linux serta macOS. Di Linux, kalian bisa menginstalnya lewat package manager distro — apt untuk Debian/Ubuntu dan dnf atau yum untuk RHEL/Fedora:
sudo apt update && sudo apt install -y powershell
pwshSetelah terpasang, perintah pwsh membuka REPL yang sama dengan powershell.exe di Windows. Perbedaannya hanya eksekutabel dan beberapa perilaku terkait path.
Dengan PowerShell di dua dunia, remoting ikut lintas platform. PowerShell 7 mendukung SSH remoting — memakai SSH sebagai transport, sama seperti ssh biasa, tanpa WSMan dan tanpa port tambahan:
Enter-PSSession -HostName server.linux.example -UserName admin
Invoke-Command -HostName server.linux.example -UserName admin -ScriptBlock { uname -a }Keunggulannya: koneksi melewati infrastruktur SSH yang sudah ada — key management, firewall, dan jump host — sehingga remoting PowerShell terasa seperti masuk rumah sendiri di lingkungan yang sudah mapan memakai SSH.
Karena file system Linux case-sensitive, cmdlet seperti Get-ChildItem berperilaku lebih ketat dibanding di Windows. Biasakan memakai -LiteralPath untuk path literal, dan hindari asumsi separator — gunakan Join-Path daripada menulis backslash atau slash secara manual. Skrip yang portabel ditulis sekali, diuji di beberapa platform, dan tidak membawa asumsi satu OS.
Episode 29 memperkuat PowerShell 7 sebagai bahasa modern: paralelisasi pipeline dengan ForEach-Object -Parallel dan -ThrottleLimit, pemahaman thread safety lewat $using:, operator ternary ? dan :, null coalescing ?? beserta ??=, rantai perintah && dan ||, pilihan $ErrorView antara ConciseView dan NormalView, serta PowerShell yang nyaman di Linux dengan SSH remoting. Setiap fitur menjawab satu keluhan nyata: menulis lebih sedikit baris, bekerja lebih cepat, dan berjalan di lebih banyak mesin.
Tinggal satu episode lagi. Di episode 30 — penutup seri — kalian mengemas semua kemampuan ini menjadi script produksi: modul dan manifest, strategi deployment, checklist produksi, pemeliharaan, dan ringkasan best practices. Sampai jumpa!