2016-10-26 36 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 {}的節,並且您可以在其中創建參數。

相關問題