我可以在PowerShell中为参数指定条件默认值吗?

时间:2016-10-26 17:43:53

标签: powershell parameters default-value

我认为如果这是可能的,它可能会使用参数集,所以我尝试了以下内容:

$ awk -F\' '{OFS=FS; for (i=1;i<=NF;i++) gsub(/ /,(i%2?"|":"_"),$i)}1' file
active=1|'oldest_active'=0s|disabled=0|'function_call'=0

执行此操作以创建函数会导致错误Function New-TestMultipleDefaultValues { [CmdletBinding(DefaultParameterSetName="Default1")] param ( [Parameter(Mandatory,ParameterSetName="Default1")]$SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1, [Parameter(ParameterSetName="Default1")]$Test1 = "Value1", [Parameter(ParameterSetName="Default2")]$Test1 = "Value2" ) $PSBoundParameters } ,因此看起来这种方式看起来不是一种选择。

此时我唯一能想到的就是做这样的事情:

Duplicate parameter $test1 in parameter list.

哪个有效,但看起来很难看:

Function New-TestMultipleDefaultValues {
    param (
        $SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1,
        $Test1
    )
    if (-not $Test1 -and $SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1) {
        $Test1 = "Value1"
    } elseif (-not $Test1 -and -not $SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1) {
        $Test1 = "Value2"
    }

    $Test1
}

有没有更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

以下似乎有效:

Function New-TestMultipleDefaultValues {
    [CmdletBinding(DefaultParameterSetName="Default1")]
    param (
      [Parameter(ParameterSetName="Default1")] $SomeOtherThing,
      [Parameter(ParameterSetName="Default1")] $Test1 = 
        $(@( 'Value2', 'Value1' )[$PSBoundParameters.ContainsKey('SomeOtherThing')])
    )
    # If -Test1 <value> is explicitly specified, that value is bound to $Test1.
    # By default, $Test1 contains 'Value1' if -SomeOtherThing <val> was specified,
    # and 'Value2' otherwise.
    $Test1 
}
  • 可以使用子表达式运算符$(...)来定义参数默认值。

  • 显然,在绑定了显式指定的参数之后,会对这些表达式进行求值,这允许表达式检查已绑定的参数。

  • @( 'Value2', 'Value1' )[$PSBoundParameters.ContainsKey('SomeOtherThing')]只是一个更简洁的重新制定 if ($PSBoundParameters.ContainsKey('SomeOtherThing')) { 'Value1' } else { 'Value2' }
    在数组下标(整数)上下文中使用时,利用[bool]值映射到0$false)和1$true)。

答案 1 :(得分:0)

您可能需要查看动态参数。你声明了一个名为dynamicparams {}的部分,你可以在里面创建参数。