簡體   English   中英

Powershell cmdlet的嵌套參數

[英]Nested parameters for Powershell cmdlet

新手問題。

如何為Powershell cmdlet聲明嵌套參數? 我想要一個看起來像這樣的cmdlet。

New-FootballTeam 
[-Defenders [[-LeftBack] <string>] [[-RightBack] <string>] ]
[-Midfielders [[-LeftWing] <string>] [[-RightWing] <string>] [[-CentreMidfield] <string>] ] 

我嘗試使用ParameterSetName參數將DefendersMidfielders下的參數組合在一起。 但是當我為help New-FootballTeam提供help New-FootballTeamDefendersMidfielders標簽沒有出現,我看到了類似的東西。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM