2014-12-13 3 views
1

Новый вопрос.Вложенные параметры для командлета Powershell

Как объявить вложенные параметры для командлета Powershell? Мне нужен командлет, который будет выглядеть примерно так.

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

Я попытался с помощью параметра ParameterSetName клуба параметров под Defenders и Midfielders вместе. Но когда я делаю help New-FootballTeam, теги Defenders и Midfielders не отображаются, и я вижу что-то вроде этого.

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

Спасибо, заранее.

+0

ПараметрНастройки в PowerShell являются взаимоисключающими (хотя некоторые параметры могут быть во всех наборах параметров). Это ваше намерение? Что вы не можете указать -LeftBack в то же время, что и -LeftWing? Если это не так, зачем вам нужны параметры -Defenders и -Midfielders? У вас может быть -LeftBackDefender, -RightBackDefender, -LeftWingMidfielder и т. Д. –

+0

Мое намерение - это реализовать командлет, который действует, как я упоминал выше. Перед публикацией здесь я искал пути и наткнулся на ParameterSets и написал об этом здесь, потому что я не знал, может ли это быть решением. И да. Есть очевидные обходные пути, такие как использование -LeftBackDefender и -RightBackDefender. Но, конечно, должен быть способ реализовать его так, как я упомянул в вопросе? –

ответ

3

PowerShell не поддерживает вложение параметров, как вы его описали. PowerShell поддерживает несколько ParameterSets, которые позволяют вам указывать разные «наборы» параметров, которые действительны для конкретного вызова команды. ParameterSets (кроме внутренних AllParametersSet - если не указаны параметры, которые не назначены параметром), являются взаимоисключающими. Обычно каждый набор параметров имеет уникальный параметр, который PowerShell использует для выбора определенного набора параметров, который будет использоваться для синтаксического анализа параметров - это взаимоисключающий бит. Если PowerShell не может определить, какой набор параметров использовать, он выдаст ошибку. В некоторых случаях вы можете помочь PowerShell, используя [CmdletBinding(DefaultParameterSet="<defaultParameterSetName>")], чтобы сообщить PowerShell, какие параметры использовать, когда он не может понять это на основе предоставленных параметров и аргументов.

1

Существует чистая функция powershell Dynamic Parameters, которую вы можете использовать для решения этой проблемы. Это немного многословно, хотя:

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 может иногда играть с ними тоже. Но он работает, и поскольку параметры в примере установлены на «Обязательный», когда установлены переключатели Defenders/Midfielders, PS предложит вам ввести необходимые Wings/Backs. Dynamic parameters - defenders only Dynamic parameters = defenders and midfielders

0

Определение вашего параметра следующим образом:

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 в этом примере. Вы можете точно сказать, что вы подразумеваете под именами параметров. Было бы проще просто иметь все позиции в качестве параметров в одном наборе.

+0

Это не сработает, потому что OP не хочет, чтобы эти параметры были взаимоисключающими, а наборы параметров взаимоисключающими. –

+0

@KeithHill Возможно, я неправильно понял, что ищет OP, основанный на форматировании вопроса. Я подумал, что нужно два набора параметров. Я не уверен, что вы подразумеваете под «взаимоисключающим». Конечно, когда вы вызываете команду, ей приходится решать один однозначный набор параметров, но параметр может быть в одном, все или выбирать наборы параметров. –

+0

Да, но ваше определение не позволит указать Defenders и Midfields для одного вызова. И хотя вы можете поместить пять «вложенных» параметров в оба набора параметров, параметры параметров верхнего уровня (Defenders и Midfielders) по-прежнему являются взаимоисключающими, поэтому эти два параметра не могут отображаться в одном вызове. –

Смежные вопросы