Organisasi kode ke dalam unit yang bisa dibagikan: kenali script module, manifest, dan binary module, kuasai PowerShell Gallery dengan Find, Install, Update, dan Uninstall-Module, serta buat modul kalian sendiri lengkap dengan fungsi publik dan dependensi.

Di episode 12 kalian menguasai error handling — skrip kalian kini tahu cara bereaksi saat segalanya gagal. Kini waktunya mengatur kode supaya rapi dan bisa dipakai ulang. Tentu kalian bisa menumpuk semua fungsi di satu skrip besar, tapi semakin besar skrip semakin sulit dirawat, diuji, dan dibagikan.
Episode ini membahas modul: unit organisasi kode PowerShell yang mengumpulkan fungsi, cmdlet, dan sumber daya terkait dalam satu paket bernama. Kalian akan mempelajari tiga jenis modul, menjelajah dan menginstal dari PowerShell Gallery, lalu membangun modul kalian sendiri — lengkap dengan fungsi publik versus private dan deklarasi dependensi.
Analogi: skrip tunggal seperti satu lembar catatan di meja kerja — cepat ditulis tapi mudah terselip. Modul seperti rak folder yang terorganisasi: setiap folder punya label, isi jelas, dan bisa dipinjam oleh siapa pun. Modul menyatukan sekumpulan fungsi terkait di bawah satu nama — misalnya modul Pester berisi semua fungsi untuk testing.
Ada tiga jenis utama modul:
.psm1 berisi fungsi-fungsi. Paling mudah dibuat dan paling umum dipakai untuk modul buatan sendiri..psd1 yang mendeskripsikan metadata modul: nama, versi, author, dan daftar fungsi yang diekspor. Manifest memayungi file .psm1 (atau sumber lain) dengan informasi terstruktur..dll berisi cmdlet yang ditulis dalam bahasa .NET (C#). Lebih cepat dan bisa memanfaatkan fitur bahasa yang tidak ada di PowerShell, tapi butuh kompilasi.| Jenis | Ekstensi | Isi | Kapan Dipakai |
|---|---|---|---|
| Script module | .psm1 | Fungsi PowerShell | Modul buatan sendiri, cepat dibuat |
| Manifest | .psd1 | Metadata modul | Modul yang dibagikan atau disertakan |
| Binary module | .dll | Cmdlet terkompilasi | Kinerja tinggi, akses API .NET penuh |
Get-Module menampilkan modul yang sudah dimuat pada sesi berjalan. Tambahkan -ListAvailable untuk melihat semua modul yang terinstal di komputer:
Get-Module
Get-Module -ListAvailable
Get-Module -Name Microsoft.PowerShell.UtilityPerhatikan perbedaan antara "terpasang di komputer" dan "dimuat di sesi". Memuat modul ke sesi dilakukan lewat Import-Module. Sebenarnya PowerShell melakukan autoloading: memanggil perintah dari sebuah modul otomatis memuat modul itu tanpa Import-Module eksplisit — contohnya saat kalian menjalankan Get-Process, modul Microsoft.PowerShell.Management dimuat dengan sendirinya. Import-Module tetap berguna untuk modul yang tidak terdaftar di jalur pencarian, atau saat ingin memuat versi tertentu.
Modul dicari di folder-folder yang terdaftar pada variabel lingkungan $env:PSModulePath. Variabel ini adalah daftar path yang dipisahkan titik koma — analog dengan variabel PATH di sistem operasi: ketika kalian mengetik nama perintah, PowerShell mencari ke setiap folder tersebut.
$env:PSModulePath.Split(';')Tiga lokasi yang umum muncul:
Untuk memuat modul dari lokasi khusus di luar jalur pencarian, gunakan Import-Module dengan path lengkap. Modul yang kalian buat sebaiknya diletakkan di folder per-user agar bisa ditemukan otomatis.
PowerShell Gallery adalah repositori publik modul — seperti npm untuk Node.js atau PyPI untuk Python. Perintah Find-Module mencari modul di gallery tanpa menginstalnya:
Find-Module -Name Pester
Find-Module -Tag dnsFind-Module menampilkan nama, versi, author, dan deskripsi. Perhatikan properti Repository yang menunjukkan asal modul. Jika modul yang dicari tidak ditemukan, ada kemungkinan ia berasal dari repositori lain — atau nama yang salah eja.
Menemukan modul tidak sama dengan menginstalnya. Instalasi hanya diizinkan dari repositori yang dipercaya (trusted). Untuk melihat daftar repositori:
Get-PSRepositoryKarena ingin menghindari prompt saat otomasi, set repositori sebagai trusted:
Set-PSRepository -Name PSGallery -InstallationPolicy TrustedWarning
Sumber daya dari gallery adalah kode dari orang lain — jalankan dengan hati-hati. Find-Module menampilkan metadata penulis dan versi, tapi tidak menjamin keamanan. Instal hanya modul yang populer, aktif dirawat, dan bila memungkinkan tinjau kode sumbernya di GitHub sebelum digunakan di lingkungan produksi.
Instalasi dan pembaruan modul mengikuti pola yang sama dengan package manager lain:
Install-Module -Name Pester -Scope CurrentUser-Scope CurrentUser menginstal khusus pengguna saat ini — menghindari kebutuhan hak administrator. Tanpa flag ini, PowerShell mencoba menginstal untuk semua pengguna yang butuh hak tinggi.
Versi adalah bagian penting dari modul. Pasang versi tertentu dengan -RequiredVersion, lalu perbarui atau hapus dengan dua perintah berikut:
Install-Module -Name Pester -RequiredVersion 5.4.1 -Scope CurrentUserUpdate-ModuleUninstall-Module -Name PesterUpdate-Module hanya memutakhirkan modul yang sudah terinstal dari gallery. Untuk melihat versi terinstal beserta lokasinya: Get-Module -Name Pester -ListAvailable | Select-Object Name, Version, Path. Dengan -RequiredVersion, kalian bisa mempertahankan versi tertentu yang sudah teruji di produksi tanpa terikut Update-Module.
Membuat script module sederhana hanyalah menulis fungsi ke file dengan ekstensi .psm1:
function Get-DiskSpace {
param($Drive = "C:")
Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='$Drive'" |
Select-Object DeviceID,
@{n="TotalGB"; e={[math]::Round($_.Size/1GB, 2)}},
@{n="FreeGB"; e={[math]::Round($_.FreeSpace/1GB, 2)}}
}
Export-ModuleMember -Function Get-DiskSpaceUntuk memuatnya ke sesi:
Import-Module ./MyUtils.psm1
Get-DiskSpace -Drive "D:"Fungsi yang tidak diekspor lewat Export-ModuleMember tetap ada di dalam modul tapi tidak terlihat dari luar — inilah pembagian private vs public. Fungsi publik adalah API modul; fungsi private adalah detail internal seperti helper yang hanya dipanggil fungsi publik. Menjaga fungsi private tetap tersembunyi membuat antarmuka modul bersih dan mencegah pemakai mengandalkan hal yang tidak resmi.
Untuk modul yang akan dibagikan, bungkus dengan manifest .psd1. Manifest adalah file teks berisi tabel yang mendeskripsikan modul. Membuatnya paling mudah dengan New-ModuleManifest:
New-ModuleManifest -Path ./MyUtils/MyUtils.psd1 `
-RootModule MyUtils.psm1 `
-ModuleVersion "1.0.0" `
-Description "Utilitas disk sederhana"Manifest menyatakan metadata: RootModule menunjuk file .psm1 utama, ModuleVersion untuk versi, dan FunctionsToExport untuk daftar fungsi publik. -Author melengkapi kredibilitas modul. Ketika struktur folder MyUtils/MyUtils.psd1 dan MyUtils/MyUtils.psm1 diletakkan di folder per-user pada $env:PSModulePath, modul ditemukan otomatis oleh Get-Module -ListAvailable tanpa Import-Module manual.
Jika modul kalian membutuhkan modul lain, nyatakan sebagai dependensi di manifest lewat RequiredModules — saat modul dimuat, dependensi ikut dimuat. Ini menjawab masalah "mengapa modul saya rusak di komputer lain?", yang biasanya karena dependensinya tidak ada:
@{
RootModule = "MyUtils.psm1"
ModuleVersion = "1.0.0"
RequiredModules = @(
@{ ModuleName = "Pester"; ModuleVersion = "5.0.0" }
)
}Dependensi menjawab masalah "mengapa modul saya rusak di komputer lain?" — jawabannya biasanya: karena dependensinya tidak ada. Manifest yang menyatakan dependensi membuat modul kalian bisa dibangun ulang di lingkungan mana pun dengan komponen yang sama.
Beberapa modul yang hampir selalu muncul di lingkungan Windows dan DevOps:
Get-ADUser, Set-ADGroup, Search-ADAccount. Bawaan server Windows dan RSAT.Get-Command -Module adalah jalan pintas untuk melihat semua perintah yang diekspor sebuah modul:
Get-Command -Module Microsoft.Graph.UsersEpisode ini mengubah kumpulan skrip kalian menjadi perpustakaan yang terorganisasi: tiga jenis modul (script module .psm1, manifest .psd1, binary module .dll); menjelajah modul terpasang dengan Get-Module dan memuat manual dengan Import-Module; memanfaatkan PowerShell Gallery lewat Find-Module, Install-Module, Update-Module, dan Uninstall-Module; serta membuat modul sendiri dengan ekspor fungsi publik, manifest, dan deklarasi dependensi.
Poin kunci yang dibawa pulang:
Import-Module untuk kontrol manual.Find-Module; instalasi butuh repositori yang trusted.Modul mengorganisasi perintah di komputer kalian sendiri. Episode 14 membuka cakrawala lebih luas: menjalankan perintah di komputer lain. PowerShell Remoting — WinRM, Enter-PSSession, Invoke-Command, sesi persisten, hingga JEA. Sampai jumpa di episode 14!