Выберите набор параметров из набора параметров - PullRequest
1 голос
/ 12 марта 2020

Я пытался создать Parameter set для моего модуля с Parameter Set Names, который изменяется из-за выбора the Validate set.

Пример

[CmdletBinding(DefaultParameterSetName='All Need')]
Param
(
    [Parameter(Mandatory=$true, 
       ValueFromPipeline=$true,
       ValueFromPipelineByPropertyName=$true, 
       ValueFromRemainingArguments=$false, 
       Position=0,
       ParameterSetName='All')]
    [ValidateSet("Selection A","Selection B","Selection C")]
    [String]$1,

    [Parameter(Mandatory=$true,
    ParameterSetName='All')]
    [String]$2,

    [Parameter(ParameterSetName='A')]
    [String]$3,

    [Parameter(ParameterSetName='B')]
    [String]$4,

    [Parameter(ParameterSetName='C')]
    [String]$5
) 

Но мне не удалось найти способ (например), чтобы показать набор параметров B, только если я выбрал Выбор B в наборе проверки.

1 Ответ

1 голос
/ 12 марта 2020

Да, вы можете, используя аккуратную маленькую функцию под названием Dynami c Набор параметров. Подробности здесь:

Как реализовать параметры Dynami c в функциях PowerShell

Как объявить Dynami c Параметры

В этом примере показано, как определить параметры Dynami c, которые добавляются в командлет во время выполнения. В этом примере параметр Department добавляется в командлет каждый раз, когда пользователь указывает параметр переключателя Employee. Для получения дополнительной информации о параметрах Dynami c см. Параметры командлета Dynami c.

и здесь:

Создание наборов Dynami c для ValidateSet

Dynami c Параметры в PowerShell

Простой пример:

Function Get-Order 
{
    [CmdletBinding()]
    Param
    (
      [Parameter(
         Mandatory=$true,
         Position=1,
         HelpMessage="How many cups would you like to purchase?"
      )]
      [int]$cups,

      [Parameter(
         Mandatory=$false,
         Position=2,
         HelpMessage="What would you like to purchase?"
      )]
      [ValidateSet("Lemonade","Water","Tea","Coffee")]
      [string]$product="Lemonade"
   )

   Process 
   {
      $order = @()
      for ($cup = 1; $cup -le $cups; $cup++) {
          $order += "$($cup): A cup of $($product)"
      }
      $order
   }
}

Итак, ваш вопрос можно рассматривать как дубликат этого StackOverflow Q & A , который является более длинной версией простого вышеупомянутого.

Можно ли настроить набор параметров в зависимости от значения другого параметра

Отображение принятого ответа и модификации для окончательного варианта использования с помощью OP.

function New-DynamicParameter
{
    [CmdletBinding(DefaultParameterSetName = 'Core')]    
    param
    (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)][string] $Name,
        [Parameter(Mandatory = $true, ParameterSetName = 'Core')][Parameter(Mandatory = $true, ParameterSetName = 'ValidateSet')][type] $Type,
        [Parameter(Mandatory = $false)][string] $ParameterSetName = '__AllParameterSets',
        [Parameter(Mandatory = $false)][bool] $Mandatory = $false,
        [Parameter(Mandatory = $false)][int] $Position,
        [Parameter(Mandatory = $false)][bool] $ValueFromPipelineByPropertyName = $false,
        [Parameter(Mandatory = $false)][string] $HelpMessage,
        [Parameter(Mandatory = $true, ParameterSetName = 'ValidateSet')][string[]] $ValidateSet,
        [Parameter(Mandatory = $false, ParameterSetName = 'ValidateSet')][bool] $IgnoreCase = $true
    )

    process
    {
        # Define Parameter Attributes
        $ParameterAttribute = New-Object System.Management.Automation.ParameterAttribute
        $ParameterAttribute.ParameterSetName = $ParameterSetName
        $ParameterAttribute.Mandatory = $Mandatory
        $ParameterAttribute.Position = $Position
        $ParameterAttribute.ValueFromPipelineByPropertyName = $ValueFromPipelineByPropertyName
        $ParameterAttribute.HelpMessage = $HelpMessage

        # Define Parameter Validation Options if ValidateSet set was used
        if ($PSCmdlet.ParameterSetName -eq 'ValidateSet')
        {
            $ParameterValidateSet = New-Object System.Management.Automation.ValidateSetAttribute -ArgumentList $ValidateSet -Strict (!$IgnoreCase)
        }

        # Add Parameter Attributes and ValidateSet to an Attribute Collection
        $AttributeCollection = New-Object Collections.ObjectModel.Collection[System.Attribute]
        $AttributeCollection.Add($ParameterAttribute)
        $AttributeCollection.Add($ParameterValidateSet)

        # Add parameter to parameter list
        $Parameter = New-Object System.Management.Automation.RuntimeDefinedParameter -ArgumentList @($Name, $Type, $AttributeCollection)

        # Expose parameter to the namespace
        $ParameterDictionary = New-Object System.Management.Automation.RuntimeDefinedParameterDictionary
        $ParameterDictionary.Add($Name, $Parameter)
        return $ParameterDictionary
    }
}

function Authenticate
{
  param
  (
    [ValidateSet('WindowsAuthentication','UsernameAndPassword')][string] $AuthenticationType
  )

  DynamicParam
  {
    if ($AuthenticationType -eq 'UsernameAndPassword')
    {
      New-DynamicParameter Username [string] -Mandatory $true
      New-DynamicParameter Password [string] -Mandatory $true
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...