[英]Nested parameters for Powershell cmdlet
新手問題。
如何為Powershell cmdlet聲明嵌套參數? 我想要一個看起來像這樣的cmdlet。
New-FootballTeam
[-Defenders [[-LeftBack] <string>] [[-RightBack] <string>] ]
[-Midfielders [[-LeftWing] <string>] [[-RightWing] <string>] [[-CentreMidfield] <string>] ]
我嘗試使用ParameterSetName
參數將Defenders
和Midfielders
下的參數組合在一起。 但是當我為help New-FootballTeam
提供help New-FootballTeam
, Defenders
和Midfielders
標簽沒有出現,我看到了類似的東西。
New-FootballTeam
[[-LeftBack] <string>] [[-RightBack] <string>]
[[-LeftWing] <string>] [[-RightWing] <string>] [[-CentreMidfield] <string>]
提前致謝。
PowerShell不像您描述的那樣支持參數嵌套。 PowerShell支持多個ParameterSet,可讓您指定對特定命令調用有效的不同參數“集”。 ParameterSet(內部的AllParametersSet除外-放置未分配參數集的參數)是互斥的。 通常,每個參數集都有一個唯一的參數,PowerShell會使用該參數來選擇用於參數解析的特定參數集-這是互斥的位。 如果PowerShell無法確定要使用哪個參數集,則會發出錯誤。 在某些情況下,可以通過使用[CmdletBinding(DefaultParameterSet="<defaultParameterSetName>")]
告訴PowerShell,當無法根據提供的參數和參數弄清楚PowerShell使用哪個參數集時,可以幫助PowerShell。
有一個名為“動態參數”的精巧Powershell功能,可用於解決此問題。 但是有點長:
Function New-FootballTeam {
[CmdletBinding()]
Param(
[Switch]$Defenders,
[Switch]$Midfielders
)
DynamicParam {
$dynamicParameters = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
$toAdd = @()
if ($Defenders) {
$toAdd += @('LeftBack', 'RightBack')
}
if ($Midfielders) {
$toAdd += @('LeftWing', 'RightWing')
}
$toAdd | % {
$attr = New-Object System.Management.Automation.ParameterAttribute
$attr.ParameterSetName = "__AllParameterSets"
$attr.Mandatory = $True
$attributes = New-Object System.Collections.ObjectModel.Collection[System.Attribute]
$attributes.Add($attr)
$param = New-Object System.Management.Automation.RuntimeDefinedParameter(
$_,
'string',
$attributes
)
$dynamicParameters.Add($_, $param)
}
return $dynamicParameters
}
Begin {
$LeftBack = $PSBoundParameters.LeftBack
$RightBack = $PSBoundParameters.RightBack
$LeftWing = $PSBoundParameters.LeftWing
$RightWing = $PSBoundParameters.RightWing
}
End {
if ($Defenders) {
Write-Host "LeftBack : $LeftBack"
Write-Host "RightBack: $RightBack"
}
if ($Midfielders) {
Write-Host "LeftWing : $LeftWing"
Write-Host "RightWing: $RightWing"
}
}
}
但是,此解決方案有一些警告-使用Get-Help時未列出動態參數,並且Intellisense有時也可以使用它們。 但這確實有效,並且由於示例中的參數設置為“強制”,所以在設置了“后衛” /“中場”開關后,PS會提示您輸入所需的“后翼”。
像這樣定義參數:
function New-FootballTeam {
param(
[Parameter(Mandatory = $true, ParameterSetName = "Defenders")]
[switch]$Defenders,
[Parameter(ParameterSetName = "Defenders", Position = 0)]
[string]$LeftBack,
[Parameter(ParameterSetName = "Defenders", Position = 1)]
[string]$RightBack,
[Parameter(Mandatory = $true, ParameterSetName = "Midfielders")]
[switch]$Midfielders,
[Parameter(ParameterSetName = "Midfielders", Position = 0)]
[string]$LeftWing,
[Parameter(ParameterSetName = "Midfielders", Position = 1)]
[string]$RightWing,
[Parameter(ParameterSetName = "Midfielders", Position = 2)]
[string]$CentreMidfield
)
}
會給你一些你想要的東西:
NAME
New-FootballTeam
SYNTAX
New-FootballTeam [[-LeftBack] <string>] [[-RightBack] <string>] -Defenders [<CommonParameters>]
New-FootballTeam [[-LeftWing] <string>] [[-RightWing] <string>] [[-CentreMidfield] <string>] -Midfielders [<CommonParameters>]
盡管在此示例中我不太確定參數集或參數Defenders和Midfielders的意義。 您可以通過參數名稱准確說明您的意思。 將所有位置作為參數放在一個集合中會更簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.