function 函數名稱 (參數) { 程式碼區塊 }
# 或
function 函數名稱 {
param (參數清單)
程式碼區塊
}
function Time { Get-Date }
Time # 輸出目前日期時間

function Add ($x, $y) {
$n = $x + $y
"$x + $y = $n"
}
Add 3 5 # 輸出:3 + 5 = 8

function Add {
param (
[int]$x = 0,
[int]$y = 0
)
$n = $x + $y
"$x + $y = $n"
}
優點:防止型別錯誤、參數缺失時有預設行為、提升腳本健壯度。
讓函數接收管線輸入:
function Find-WindowsFolder {
$input | Where-Object { $_.Name -eq "Windows" }
}
Get-ChildItem C:\ | Find-WindowsFolder

$input 代表管線傳入的完整物件集合(列舉器)。
針對管線處理提供三個階段區塊:
| 區塊 | 執行時機 | 典型用途 |
|---|---|---|
| Begin | 函數首次啟動,僅執行一次 | 初始化變數、開啟連線、建立暫存資源 |
| Process | 每個管線物件傳入時各執行一次 | 核心轉換邏輯、逐項處理、累加計算 |
| End | 管線結束,僅執行一次 | 清理資源、輸出彙總結果、關閉連線 |
function Process-Files {
begin {
"=== 開始處理 ==="
$count = 0
$totalSize = 0
}
process {
$count++
$totalSize += $_.Length
"[$count] $($_.Name) - $($_.Length) bytes"
}
end {
"=== 處理完成 ==="
"總計:$count 個檔案,總大小:$totalSize bytes"
}
}
Get-ChildItem | Process-Files

Begin/Process/End 結構,區塊外不得有其他程式碼Process 區塊內 $_ 代表目前管線物件Process 區塊,管線物件會整批存入 $input函數內定義的變數(如範例中的 $n、$count)為區域變數,函數結束後自動銷毀,不會污染全域環境。
Get-Service、Set-Config).SYNOPSIS、.PARAMETER 等)支援 Get-Help掌握函數進階特性,能編寫出專業級、可重用、支援管線的 PowerShell 模組與腳本。