powershell - 制作 PowerShell 所需的众多参数中的至少一个

标签 powershell parameters optional-parameters powershell-5.1

在 PowerShell 中,我想编写一个函数,它接受不同的选项作为参数。没关系,如果它接收多个参数,但它必须接收至少一个参数。我想通过参数定义而不是之后的代码来强制执行它。我可以使用以下代码让它工作:

function Set-Option {

    Param(
        [Parameter(Mandatory, ParameterSetName="AtLeastOption1")]
        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption2")]
        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption3")]
        $Option1,

        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption1")]
        [Parameter(Mandatory, ParameterSetName="AtLeastOption2")]
        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption3")]
        $Option2,

        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption1")]
        [Parameter(Mandatory=$false, ParameterSetName="AtLeastOption2")]
        [Parameter(Mandatory, ParameterSetName="AtLeastOption3")]
        $Option3
    )

    # Do stuff, but don't evaluate the plausibility of the given parameters here
}

但如您所见,它的扩展性很差。对于每个附加选项,我必须在所有其他选项中添加一行。能否以更高效和更易于维护的方式完成此操作?

正如我已经说过的,我不想检查代码中的参数,e。 G。通过评估 $PSBoundParameters。出于自动文档的原因,我希望它发生在参数定义中。


如果您需要真实世界的示例,请查看 Set-DhcpServerv4OptionValue它接受许多不同的选项(-DnsDomain-DnsServer-Router、...),其中可以全部使用,但没有任何意义是没有意义的。


注意:在提供了多个答案之后,我才意识到我的代码实际上不起作用,如果您提供了不止一个选项的话。

最佳答案

以下不是一个很好的解决方案 - 根据您所说的 auto-doc 的含义,它可能不适合您 - 但它可以很好地扩展,因为您只需要 < em>一个附加参数集:

function Set-Option {

  [CmdletBinding(DefaultParameterSetName='Fail')]
  Param(
      [Parameter(ParameterSetName='AtLeastOne')]
      $Option1,

      [Parameter(ParameterSetName='AtLeastOne')]
      $Option2,

      [Parameter(ParameterSetName='AtLeastOne')]
      $Option3,

      # Note: All that 'DontShow' does is to exclude the param. from tab completion.
      [Parameter(ParameterSetName='Fail', DontShow)] 
      ${-} = $(throw "Please specify at least one option.")
  )

  # Do stuff, but don't evaluate the plausibility of the given parameters here
}
  • 所有真实参数都是可选并且属于不是默认值的相同参数集。

  • 虚拟参数的用途${-} ,这是默认参数集中唯一的一个,只是通过其默认值抛出错误。

    • 由于它的名字不规则,你实际上不能给它传递一个明确的值(这在这里是可取的,因为它纯粹是辅助而不是直接使用):你必须使用 -- <value> ,但是 --对参数绑定(bind)器有特殊意义(为后续参数停用命名参数绑定(bind))。

    • 不幸的是,属性(property)DontShow (例如 [Parameter(DontShow)])仅隐藏tab-completion 中的参数,而不是语法图中的参数。

因此,不幸的是,虚拟参数集及其参数出现在语法图中,因此 Set-Option -?显示如下:

SYNTAX
    Set-Option [-- <Object>] [<CommonParameters>]

    Set-Option [-Option1 <Object>] [-Option2 <Object>] [-Option3 <Object>] [<CommonParameters>]

请注意,语法图缺少您所需逻辑的符号。

关于powershell - 制作 PowerShell 所需的众多参数中的至少一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71574961/

相关文章:

objective-c - Objective C 中可变数量的方法参数——需要一个例子

c++ - 提供第二个可选参数而不需要提供第一个可选参数?

visual-studio - Visual Studio 立即窗口和 PowerShell

java - 查找当前执行的jar文件名

java - 使用许多可选参数有效地重载函数

java - Hibernate 异常 - 无法找到命名参数 [:laboratoryId]

python - -u、-m 参数的作用是什么?

powershell - 如何在Powershell中排除一个子文件夹的同时复制文件夹

Powershell(cmd too) 无法识别特殊字符 "ą, ę"等

string - Powershell Select-String 然后获取返回文件的数据