Lewati batas PowerShell: akses framework .NET secara langsung, otomasi aplikasi desktop seperti Excel lewat COM objects, dan tambahkan logika kustom dengan kode C Sharp inline lewat Add-Type.

Di episode 16 kalian mengakses repositori informasi sistem lewat CIM. Tapi data di luar sistem operasi — file, jaringan, tanggal, enkripsi, hingga aplikasi desktop — juga bisa dijangkau. Rahasianya: PowerShell dibangun di atas .NET, dan setiap baris kode yang kalian tulis sebenarnya sedang berdiri di atas fondasi itu.
Episode 17 membuka dua pintu: .NET integration — memanggil tipe dan metode .NET secara langsung, dari System.IO hingga System.Security.Cryptography — dan COM objects — mengotomasi aplikasi desktop seperti Excel dan Word. Di akhir, kalian akan menyuntikkan kode C# sendiri dengan Add-Type.
PowerShell dibangun di atas .NET — setiap string, angka, atau objek yang kalian pegang adalah objek .NET. Akses ke .NET menggunakan type literal: nama tipe di dalam tanda kurung siku, misal [System.Math], [System.IO.File], atau [System.DateTime].
Pola dasar: metode statis dipanggil dengan dua titik dua setelah nama tipe. Metode statis tidak butuh instance — dipanggil langsung dari tipe:
[System.Math]::Max(5, 10)
[System.DateTime]::Now
[System.Math]::Round(3.14159, 2)[System.DateTime]::Now mengembalikan waktu saat ini; [System.Math]::Round membulatkan angka. Keduanya langsung dipanggil dari tipe tanpa membuat objek. Ini bedanya dengan metode instance yang beroperasi pada sebuah objek:
$tanggal = [System.DateTime]::Now
$tanggal.AddDays(7)$tanggal adalah instance; AddDays adalah metode yang beroperasi pada instance tersebut. Dua pola inilah fondasi seluruh integrasi .NET: statis untuk utilitas, instance untuk objek.
.NET diorganisasi dalam namespace — folder konseptual berisi tipe terkait. Beberapa yang paling sering dipakai:
| Namespace | Fungsi |
|---|---|
| System.IO | File, folder, stream |
| System.DateTime | Tanggal dan waktu |
| System.Net | Jaringan, HTTP |
| System.Security.Cryptography | Enkripsi dan hash |
| System.Text.RegularExpressions | Regex tingkat lanjut |
Praktik singkat per namespace:
[System.IO.File]::ReadAllText("/etc/hosts")
[System.IO.File]::WriteAllText("/tmp/hello.txt", "Halo dari PowerShell")[System.Net.WebClient]::new().DownloadString("https://contoh.com/data")Perhatikan pola [System.Net.WebClient]::new() — cara PowerShell memanggil konstruktor .NET. Untuk tipe yang dikonstruksi dengan parameter, tambahkan argumen di dalam tanda kurung.
Kebanyakan tipe .NET harus dibuat instance-nya sebelum dipakai. Ada dua cara: konstruktor dengan ::new() (PowerShell 5+), atau cmdlet New-Object:
$hasil1 = [System.Text.StringBuilder]::new()
$hasil2 = New-Object System.Text.StringBuilderStringBuilder adalah objek untuk menyusun string secara efisien — analogi menempelkan stiker satu per satu ke buku, daripada menulis ulang seluruh buku setiap kali. Bandingkan kecepatan menggabungkan ribuan string dengan operator += versus StringBuilder; perbedaannya drastis.
COM (Component Object Model) adalah teknologi Windows yang memungkinkan skrip "mengemudikan" aplikasi: Excel, Word, Outlook. Melalui New-Object -ComObject, kalian membuat instance aplikasi dan mengontrolnya dari PowerShell.
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
$buku = $excel.Workbooks.Add()
$sheet = $buku.Worksheets.Item(1)
$sheet.Cells.Item(1,1) = "Nama"
$sheet.Cells.Item(1,2) = "Skor"
$sheet.Cells.Item(2,1) = "Arman"
$sheet.Cells.Item(2,2) = 95
$buku.SaveAs("C:\tmp\laporan.xlsx")
$buku.Close()Ini bekerja karena Excel mengekspos antarmuka COM. $excel.Visible = $false membuat aplikasi berjalan tanpa menampilkan jendela — mode otomasi yang umum untuk menghasilkan laporan. Untuk Word, polanya serupa: New-Object -ComObject Word.Application lalu $word.Documents.Add().
COM object adalah sumber daya yang wajib dilepas — seperti meminjam mobil operasional: selesai dipakai harus dikembalikan, jika tidak denda menumpuk (di sini: proses aplikasi yang menggantung di memori).
$excel = New-Object -ComObject Excel.Application
try {
$buku = $excel.Workbooks.Add()
$buku.SaveAs("C:\tmp\laporan.xlsx")
$buku.Close()
}
finally {
$excel.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
[GC]::Collect()
[GC]::WaitForPendingFinalizers()
}Marshal.ReleaseComObject menurunkan penghitung referensi COM; ketika mencapai nol, objek dibebaskan. Pemanggilan [GC]::Collect dan [GC]::WaitForPendingFinalizers memastikan resource benar-benar dikembalikan ke sistem. Pola finally ini persis pelajaran episode 12: pembersihan dijamin berjalan apa pun yang terjadi.
Warning
Lupa melepas COM object menyebabkan proses aplikasi menggantung di memori. Excel yang dibuat lewat skrip dan tidak dilepas akan tertinggal sebagai proses EXCEL.EXE di Task Manager — dan menumpuk di setiap eksekusi skrip. Selalu lepas dalam blok finally dan panggil $app.Quit() bila tersedia.
PowerShell punya operator -match, tapi untuk pekerjaan regex tingkat lanjut — matching global, grup bernama, penggantian kompleks — [System.Text.RegularExpressions.Regex] jauh lebih kuat:
$pola = [System.Text.RegularExpressions.Regex]::Match(
"IP server: 10.0.0.42",
"(\d+\.){3}\d+"
)
$pola.ValueUntuk kriptografi, [System.Security.Cryptography] menyediakan fungsi hash dan enkripsi bawaan. Contoh menghitung hash SHA256 sebuah file:
$sha = [System.Security.Cryptography.SHA256]::Create()
$stream = [System.IO.File]::OpenRead("/etc/hosts")
$hash = $sha.ComputeHash($stream)
$stream.Close()
($hash | ForEach-Object { $_.ToString("x2") }) -join ""Hash adalah jejak digital sebuah file: dua file identik menghasilkan hash yang sama persis. Memverifikasi checksum unduhan atau mengaudit integritas file adalah penggunaan paling umum pola ini.
Jika built-in .NET belum cukup, Add-Type -TypeDefinition menyuntikkan kode C# langsung ke sesi. Setelah dikompilasi, kode itu bisa dipanggil seperti tipe .NET lain:
Add-Type -TypeDefinition @"
using System;
public class Kalkulator {
public static int Kali(int a, int b) {
return a * b;
}
}
"@
[Kalkulator]::Kali(6, 7)Add-Type menerima here-string berisi kode C#, mengompilasinya saat itu juga, dan mendaftarkan tipe ke sesi. [Kalkulator]::Kali memanggil metode statis C# persis seperti tipe .NET asli. Ini berguna ketika logika memerlukan fitur C# yang tidak nyaman di PowerShell — misalnya algoritma performa tinggi atau struktur data kompleks.
Tip
Mulailah dari tipe .NET bawaan sebelum menulis C# sendiri. Kebutuhan yang tampak kompleks — parsing tanggal, hash file, manipulasi JSON — sering sudah dijawab oleh [System.DateTime], [System.Security.Cryptography], atau [System.Text.Json]. Tulis kode C# hanya ketika solusi bawaan memang tidak ada atau terlalu lambat.
Episode ini melepas batas bahasa: kalian kini memanggil metode statis dan instance .NET lewat type literal, mengenal namespace inti dari System.IO hingga System.Security.Cryptography, membuat instance objek dengan ::new() dan New-Object, mengotomasi Excel dan Word melalui COM dengan pelepasan resource yang disiplin, serta menambahkan logika kustom dengan Add-Type dan kode C# inline.
Poin kunci yang dibawa pulang:
[Tipe]::Metode untuk statis; ::new() atau New-Object untuk instance.System.IO, System.Net, System.Security.Cryptography, dan lainnya.Marshal.ReleaseComObject di dalam finally.Add-Type -TypeDefinition menyuntikkan kode C# ke sesi.Dengan .NET dan COM, PowerShell nyaris tidak punya batas — apa pun yang bisa dilakukan aplikasi Windows, bisa dilakukan dari skrip. Episode 18 menerapkan semua fondasi yang sudah kalian bangun ke domain paling penting di dunia Windows enterprise: Active Directory Management — Get-ADUser, New-ADUser, mengelola group, dan menulis laporan direktori. Sampai jumpa di episode 18!