cv.cm

Pemrograman · Bahasa pemrograman

Tutorial PowerShell untuk pemula

7 menit baca

Jawaban singkat

PowerShell adalah shell dan bahasa scripting lintas platform dari Microsoft untuk otomatisasi. Perintahnya, yang disebut cmdlet, meneruskan objek .NET melalui pipeline alih-alih teks biasa, sehingga Anda bisa memfilter, mengurutkan, dan mengekspor data tanpa parsing. Halaman ini membahas instalasi PowerShell 7, menjalankan skrip, cmdlet, variabel, operator, alur kontrol, fungsi, koleksi, dan penanganan error.

Buka Penguji regex

Apa itu PowerShell dan untuk apa digunakan

PowerShell adalah shell dan bahasa scripting lintas platform dari Microsoft, dibangun di atas .NET. Berbeda dari shell tradisional yang meneruskan teks biasa antarperintah, PowerShell meneruskan objek .NET lengkap dengan properti dan method, sehingga Anda bisa memfilter dan mengurutkan data tanpa mengurai teks.

System administrator dan DevOps engineer memakai PowerShell untuk mengotomatisasi Windows, mengelola Active Directory, Microsoft 365, dan Azure, serta menulis skrip build dan deployment. Ada dua edisi: Windows PowerShell 5.1 yang bawaan Windows, dan PowerShell 7 ke atas (nama perintah pwsh) yang open source dan berjalan di Windows, Linux, dan macOS. Tutorial ini menargetkan PowerShell 7.

Instal PowerShell dan jalankan Hello, world

Di Windows, instal PowerShell 7 dengan winget install --id Microsoft.PowerShell --source winget; di macOS dan Linux, gunakan Homebrew atau package manager yang dijelaskan di panduan instalasi Microsoft. Skrip adalah file teks berekstensi .ps1.

# hello.ps1
Write-Output "Hello, world!"
pwsh ./hello.ps1
# Hello, world!

Di Windows, execution policy bisa memblokir skrip. Set-ExecutionPolicy -Scope CurrentUser RemoteSigned mengizinkan skrip lokal milik Anda sendiri sementara skrip hasil unduhan tetap harus ditandatangani. Visual Studio Code dengan ekstensi PowerShell adalah editor yang direkomendasikan.

Cmdlet dan pipeline

Perintah disebut cmdlet dan mengikuti pola penamaan Verb-Noun, seperti Get-Process, Set-Location, atau New-Item. Tiga cmdlet membantu Anda menjelajahi hal lainnya: Get-Command, Get-Help, dan Get-Member.

Get-Command -Noun Process          # list commands that work with processes
Get-Help Get-ChildItem -Examples   # show usage examples

# five processes using the most memory
Get-Process |
    Sort-Object -Property WorkingSet64 -Descending |
    Select-Object -First 5 -Property Name, Id, WorkingSet64

# files larger than 1 MB in the current folder
Get-ChildItem -File | Where-Object { $_.Length -gt 1MB } |
    ForEach-Object { "{0}  {1:N0} KB" -f $_.Name, ($_.Length / 1KB) }

Get-Date | Get-Member -MemberType Property   # inspect an object

Di dalam script block, $_ (atau $PSItem) adalah objek saat ini di pipeline. Karena objek mempertahankan tipenya, Sort-Object mengurutkan angka secara numerik dan tanggal secara kronologis tanpa usaha tambahan.

Variabel dan tipe

Variabel diawali $. Variabel bisa menampung objek .NET apa pun, dan Anda bisa menambahkan batasan tipe dalam kurung siku. String bertanda kutip ganda meng-expand variabel dan ekspresi $( ); string bertanda kutip tunggal bersifat literal.

$name = "Ada"
[int]$count = 3
$price = 19.99                      # System.Double
$isAdmin = $false
$today = Get-Date

"Hello, $name"                      # Hello, Ada
"Next: $($count + 1)"               # Next: 4
'No $expansion here'                # No $expansion here
$price.GetType().Name               # Double
$today.ToString("yyyy-MM-dd")       # for example 2026-10-31
[int]"42" + 1                       # 43 (explicit conversion)
TipeContohCatatan
[int]42bilangan bulat 32-bit
[double]3.14floating point; [decimal] untuk uang
[string]"text"perbandingan tidak peka huruf besar-kecil secara default
[bool]$true, $falsevariabel otomatis, bukan keyword
[datetime]Get-Dateobjek .NET DateTime lengkap
[array], [hashtable]@(1, 2), @{ a = 1 }koleksi, dibahas di bawah

Operator dan alur kontrol

Operator perbandingan berupa kata, bukan simbol: -eq, -ne, -gt, -lt, -ge, -le, -like (wildcard), -match (regular expression), dan -contains. Perbandingan string tidak peka huruf besar-kecil kecuali Anda memakai versi c seperti -ceq.

$temp = 22
if ($temp -gt 30) {
    "hot"
} elseif ($temp -ge 15) {
    "mild"                           # mild
} else {
    "cold"
}

switch ("report.csv") {
    { $_ -like "*.csv" } { "CSV file" }    # CSV file
    { $_ -like "*.txt" } { "text file" }
    default { "other" }
}

foreach ($n in 1..3) { "n = $n" }          # n = 1, n = 2, n = 3
for ($i = 0; $i -lt 2; $i++) { "i = $i" }  # i = 0, i = 1
$k = 3
while ($k -gt 0) { $k-- }
"Hello" -eq "hello"                        # True

Fungsi dan parameter

Fungsi memakai blok param() untuk mendeklarasikan parameter bernama dengan tipe. Menambahkan [CmdletBinding()] memberi fungsi common parameter yang sama dengan cmdlet bawaan, seperti -Verbose. Output apa pun yang tidak ditangkap menjadi nilai kembalian fungsi.

function Get-Greeting {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Name,
        [string]$Greeting = "Hello"
    )
    Write-Verbose "Building greeting for $Name"
    "$Greeting, $Name!"
}

Get-Greeting -Name "Ann"                  # Hello, Ann!
Get-Greeting -Name "Bo" -Greeting "Hi"    # Hi, Bo!
Get-Greeting "Cy" -Verbose                # also prints the verbose message

Panggil fungsi seperti cmdlet, dengan spasi di antara argumen: Get-Greeting -Name Ann. Menulis Get-Greeting("Ann", "Hi") meneruskan satu argumen berupa array, kejutan yang sering dialami orang dari bahasa lain.

Array, hashtable, dan objek kustom

Array dibuat dengan @( ) atau daftar yang dipisahkan koma. Hashtable, ditulis @{ }, menyimpan pasangan key-value. [pscustomobject] mengubah hashtable menjadi objek yang bekerja baik dengan Sort-Object, Format-Table, dan Export-Csv.

$langs = @("PowerShell", "Python")
$langs += "Go"                       # creates a new, longer array
$langs.Count                         # 3
$langs[0]                            # PowerShell
$langs -contains "Go"                # True

$ports = @{ http = 80; https = 443 }
$ports["ssh"] = 22
$ports.https                         # 443
$ports.Keys.Count                    # 3

$user = [pscustomobject]@{ Name = "Ann"; Age = 31 }
$user.Name                           # Ann
$people = @(
    [pscustomobject]@{ Name = "Bo"; Age = 25 }
    $user
)
$people | Sort-Object Age | Format-Table

Menambah ke array dengan += menyalin seluruh array setiap kali. Untuk loop besar, kumpulkan output loop secara langsung ($result = foreach (...) { ... }) atau pakai [System.Collections.Generic.List[object]].

Penanganan error

PowerShell punya terminating error, yang menghentikan eksekusi, dan non-terminating error, yang mencetak pesan lalu melanjutkan. try/catch/finally hanya menangkap terminating error, jadi tambahkan -ErrorAction Stop pada cmdlet saat Anda ingin menangkap kegagalannya.

try {
    $content = Get-Content -Path "missing.txt" -ErrorAction Stop
}
catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning "File not found: $($_.Exception.Message)"
}
catch {
    Write-Error "Unexpected error: $_"
}
finally {
    "cleanup done"
}

$ErrorActionPreference = "Stop"   # make all errors terminating in this script
throw "Something went wrong"      # raise your own terminating error

Di dalam catch, $_ adalah error record. Mengatur $ErrorActionPreference = "Stop" di bagian atas skrip adalah cara umum untuk fail fast.

Skrip lengkap kecil: laporan penggunaan disk

Skrip ini mendaftar file terbesar di bawah sebuah folder, mengelompokkannya menurut ekstensi, dan mengekspor laporan CSV. Skrip ini memadukan parameter, pipeline, calculated property, dan penanganan error.

# report.ps1
param(
    [string]$Path = ".",
    [int]$Top = 5
)
$ErrorActionPreference = "Stop"

$files = Get-ChildItem -Path $Path -File -Recurse

"Largest $Top files:"
$files | Sort-Object Length -Descending | Select-Object -First $Top |
    Format-Table Name, @{ Name = "SizeKB"; Expression = { [math]::Round($_.Length / 1KB, 1) } }

$byExt = $files | Group-Object Extension | ForEach-Object {
    [pscustomobject]@{
        Extension = if ($_.Name) { $_.Name } else { "(none)" }
        Files     = $_.Count
        TotalMB   = [math]::Round(($_.Group | Measure-Object Length -Sum).Sum / 1MB, 2)
    }
} | Sort-Object TotalMB -Descending

$byExt | Format-Table
$byExt | Export-Csv -Path "usage.csv" -NoTypeInformation
"Report saved to usage.csv"
pwsh ./report.ps1 -Path ~/Documents -Top 3

Langkah selanjutnya

  • PowerShell 101 dan dokumentasi PowerShell di Microsoft Learn.
  • Get-Help about_* di shell, misalnya Get-Help about_Operators; jalankan Update-Help terlebih dahulu.
  • PowerShell Gallery, repositori resmi modul, yang dipakai bersama Install-Module.
  • PSScriptAnalyzer, linter yang memeriksa skrip terhadap praktik yang direkomendasikan.

FAQ

Apa perbedaan PowerShell dan Windows PowerShell?

Windows PowerShell 5.1 adalah edisi lama bawaan Windows dan berbasis .NET Framework. PowerShell 7 ke atas adalah edisi lintas platform dan open source berbasis .NET modern, dijalankan dengan perintah pwsh.

Apakah PowerShell sama dengan Command Prompt?

Tidak. Command Prompt (cmd.exe) menjalankan perintah batch dan meneruskan teks. PowerShell adalah bahasa scripting lengkap yang meneruskan objek, meskipun masih bisa menjalankan sebagian besar program command line.

Bisakah PowerShell berjalan di Linux dan macOS?

Bisa. PowerShell 7 ke atas berjalan di Windows, Linux, dan macOS, meskipun beberapa modul khusus Windows hanya tersedia di Windows.

Mengapa skrip .ps1 saya tidak bisa dijalankan?

Execution policy di Windows mungkin memblokirnya. Jalankan Set-ExecutionPolicy -Scope CurrentUser RemoteSigned, dan mulai skrip dengan path, seperti ./script.ps1.

Apa arti $_ di PowerShell?

$_ (juga $PSItem) adalah objek saat ini di pipeline, dipakai di dalam script block untuk cmdlet seperti Where-Object dan ForEach-Object, dan merupakan error saat ini di dalam catch.

Semua tutorial pemrograman