我可以使参数集取决于另一个参数的值吗? [英] Can I make a parameter set depend on the value of another parameter?

查看:56
本文介绍了我可以使参数集取决于另一个参数的值吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个函数:

function Authenticate
{
  param
  (
    [ValidateSet('WindowsAuthentication','UsernameAndPassword')][string] $AuthenticationType,
    [Parameter(ParameterSetName='Set1')][string] $Username,
    [Parameter(ParameterSetName='Set1')][string] $Password
  )
  ..
}

并且我想在 $AuthenticationType = 'UsernameAndPassword' 时将参数设置为强制参数,但如果 $AuthenticationType = 'WindowsAuthentication' 也不能使用它>.

And I would like to make the parameter set to be mandatory when $AuthenticationType = 'UsernameAndPassword' but also so that it cannot be used if $AuthenticationType = 'WindowsAuthentication'.

这甚至可以在 PowerShell 中实现吗?

It this even possible in PowerShell?

推荐答案

使用 Tim Ferrill 回答中的链接,我创建了以下函数来帮助创建动态参数:

Using the link from Tim Ferrill's answer, I created the following function to help create dynamic parameters:

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
    }
}

并通过以下方式解决了我的特定问题:

And solved my particular problem in the following way:

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
    }
  }

  ...
}

使用动态参数时不需要设置参数,所以我删除了参数集.

It became unneeded to have a parameter set when using Dynamic Parameter so I removed the parameter set.

这篇关于我可以使参数集取决于另一个参数的值吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆