2016-10-26 34 views
1

我想如果这是可能的,可能使用参数设置工作,所以我尝试了以下内容:我可以在PowerShell中为参数指定条件默认值吗?

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 
} 

其中一期工程,但似乎丑陋:

PS C:\Users\user> New-TestMultipleDefaultValues -SomeOtherThingThatIfSpecifiedShouldResultInTest1HavingValue1 "thing" 
Value1 
PS C:\Users\user> New-TestMultipleDefaultValues 
Value2 
PS C:\Users\user> New-TestMultipleDefaultValues -Test1 "test" 
test 

什么更好的办法来做到这一点?

回答

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)。

0

你可能想看看动态参数。您声明一个名为dynamicparams {}的节,并且您可以在其中创建参数。

相关问题