PowerShell 進階函數常需要「參數互斥」:用戶只能在指定組合中二選一(如 -Id 或 -Name),或根據參數組合動態決定某參數是否強制。本文通過兩個完整示例,詳解 ParameterSetName 的核心機制與進階用法。
function Test-ParameterSet {
[CmdletBinding(DefaultParameterSetName = 'ByNumber')]
param(
[Parameter(ParameterSetName = 'ByNumber', Position = 0)]
[int]$Id,
[Parameter(ParameterSetName = 'ByName', Position = 0)]
[string]$Name
)
$PSCmdlet.ParameterSetName # 輸出觸發的參數集名稱
$PSBoundParameters # 輸出實際綁定的參數字典
}
測試:
Test-ParameterSet 123 # ByNumber, Id=123
Test-ParameterSet -Name "abc" # ByName, Name=abc
Test-ParameterSet 123 -Name "abc" # 報錯:參數集衝突
function Test-ParameterSet {
[CmdletBinding(DefaultParameterSetName = 'NonCredential')]
param(
$Id,
[Parameter(ParameterSetName = 'LocalOnly', Mandatory = $false)]
$LocalAction,
[Parameter(ParameterSetName = 'Credential', Mandatory = $true)]
[Parameter(ParameterSetName = 'NonCredential', Mandatory = $false)]
$ComputerName,
[Parameter(ParameterSetName = 'Credential', Mandatory = $false)]
$Credential
)
$PSCmdlet.ParameterSetName
$PSBoundParameters
if ($PSBoundParameters.ContainsKey('ComputerName')) {
Write-Warning 'Remote Call!'
}
}
| 調用方式 | 觸發參數集 | ComputerName | Credential | LocalAction |
|---|---|---|---|---|
Test-ParameterSet | NonCredential(預設) | 可選 | 不可用 | 可選 |
Test-ParameterSet -Credential $cred | Credential | 強制 | 可選 | 不可用 |
Test-ParameterSet -LocalAction $act | LocalOnly | 不可用 | 不可用 | 可選 |
Test-ParameterSet -ComputerName "srv" | NonCredential | 提供值 | 不可用 | 不可用 |
@('Set1','Set2'))。Mandatory 值。DefaultParameterSetName 指定無參數時的預設集合。$PSCmdlet.ParameterSetName 獲取實際觸發集合,$PSBoundParameters 檢查具體綁定參數。善用 ParameterSetName 能在聲明式層面強制參數互斥、動態切換強制性,極大減少運行時 if/else 判斷,讓函數介面既靈活又安全。