【问题标题】:Optional but mutually exclusive switches in a function函数中可选但互斥的开关
【发布时间】:2019-05-29 09:10:29
【问题描述】:

我想在自定义 powershell 模块中编写一个可以定义一些开关的函数。

该函数应该在没有开关的情况下调用,或者只有一个开关。不允许多个开关。

例如:

Get-Foo -Value "text"                          # Should return "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate  # Should return the value as date
Get-Foo -Value "42" -AsInteger                 # Should return 42 as integer
Get-Foo -Value "xxx" -AsDate -AsInteger        # Should fail

为了支持这些情况,我在玩参数集:

function Get-Foo{
    param(
        [Parameter(Mandatory=$true)]
        [string]$Value,
        [Parameter(ParameterSetName='AsDate')]
        [Switch]$AsDate,
        [Parameter(ParameterSetName='AsInteger')]
        [Switch]$AsInteger

    )

    switch ($PsCmdlet.ParameterSetName) {
        "AsDate" {
            [datetime]::Parse($Value)
        }
        "AsInteger" {
            [int]::Parse($Value)
        }
        "__AllParameterSets" { 
            $Value
        }
    }
}

但是,这并没有按预期工作。通过两个开关之一工作。通过这两个开关失败(但这是有意的)。

完全不传递开关失败,因为它无法解析参数集。

如何解决这个问题?

【问题讨论】:

  • 这看起来像答案吗:stackoverflow.com/questions/1767219/…
  • @RohinSidharth,不是真的。您建议的答案仅指定如何使用参数集,而不是如何解决“无开关” case.thx 反正

标签: powershell


【解决方案1】:

如果你给函数一个DefaultParameterSetName,并将最后一个开关测试更改为Default,事情应该可以工作:

function Get-Foo {
    [CmdletBinding(DefaultParameterSetName = 'None')]
    param(
        [Parameter(Mandatory=$true)]
        [string]$Value,
        [Parameter(ParameterSetName='AsDate')]
        [Switch]$AsDate,
        [Parameter(ParameterSetName='AsInteger')]
        [Switch]$AsInteger

    )

    switch ($PsCmdlet.ParameterSetName) {
        "AsDate" {
            [datetime]::Parse($Value)
        }
        "AsInteger" {
            [int]::Parse($Value)
        }
        default { 
            $Value
        }
    }
}

结果:

Get-Foo -Value "text"                          # Returns "text"
Get-Foo -Value "2019-01-01T00:00:00Z" -AsDate  # Returns the value as date (if Parse() is possible)
Get-Foo -Value "42" -AsInteger                 # Returns 42 as integer (if Parse() is possible)
Get-Foo -Value "xxx" -AsDate -AsInteger        # Fails

注意:对于更复杂的 Switch() 比较,请考虑使用 break 语句来阻止 switch 在匹配后进行比较。见about_Switch

【讨论】:

  • 这正是我所需要的!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 2017-01-17
  • 2018-02-04
  • 2016-04-21
  • 2016-04-27
相关资源
最近更新 更多