2010-05-11 2 views
8

일반 코드PsBoundParameters에없는 기본값이있는 매개 변수는 무엇입니까?

이 코드 고려해

PS> function Test { param($p='default value') $PsBoundParameters } 
PS> Test 'some value' 
Key                Value 
---                ----- 
p                 some value 
PS> Test 
# nothing 

내가 $PsBoundParameters 두 경우 모두에 $p 변수에 대한 기록을 포함 할 것이라고 기대합니다. 그게 올바른 행동인가요?

질문

나는 많은 기능이 같이 일하는 것이 스플래 사용하고 싶습니다

: 나는 열거 된 모든 PARAMS와 SomeFuncWithManyRequiredParams를 호출하지 않으

function SomeFuncWithManyRequiredParams { 
    param(
    [Parameter(Mandatory=$true)][string]$p1, 
    [Parameter(Mandatory=$true)][string]$p2, 
    [Parameter(Mandatory=$true)][string]$p3, 
    ...other parameters 
) 
    ... 
} 
function SimplifiedFuncWithDefaultValues { 
    param(
    [Parameter(Mandatory=$false)][string]$p1='default for p1', 
    [Parameter(Mandatory=$false)][string]$p2='default for p2', 
    [Parameter(Mandatory=$false)][string]$p3='default for p3', 
    ...other parameters 
) 
    SomeFuncWithManyRequiredParams @PsBoundParameters 
} 

를 :

SomeFuncWithManyRequiredParams -p1 $p1 -p2 $p2 -p3 $p3 ... 

가능합니까?

+0

문제의 각 매개 변수에 대해 질문해야 할 두 가지 질문이 있습니다. 왜 SomeFunc는 SimplifiedFunc와 동일한 기본값을 갖고 있지 않습니까? 그리고 기본값이 다른 경우 SimplifiedFunc에서 사용자가 기본값을 재정의하도록 허용하는 이유는 무엇입니까? (이 경우 단순히 SomeFunc를 직접 호출하여 재정의 할 수 있기 때문입니다.) – jpaugh

답변

5

"바운드"를 정의하는 방법에 따라 달라집니다. 즉, 사용자가 제공 한 값 또는 함수가 제공 한 기본값에서 바인딩 된 값이 무엇입니까? 솔직히 말해서, 나는 그것이 사용자 입력으로부터 구속 된 것을 의미하는 "바운드 (bound)"를 보면서 그것이하는 것처럼 행동한다는 것을 놀래 지 않습니다.

function SimplifiedFuncWithDefaultValues { 
    param( 
    [Parameter(Mandatory=$false)][string]$p1='default for p1', 
    [Parameter(Mandatory=$false)][string]$p2='default for p2', 
    [Parameter(Mandatory=$false)][string]$p3='default for p3', 
    ...other parameters 
) 
    if (!$PSBoundParameters.ContainsKey(p1)) 
    { 
    $PSBoundParameters.p1 = 'default for p1' 
    } 
    # rinse and repeat for other default parameters. 
    SomeFuncWithManyRequiredParams @PSBoundParameters 
} 
+0

좋아요,'$ PSBoundParameters'는 명시 적으로 제공된 인수 만 포함 할 수 있다는 점에 동의합니다. 정의에 따라 다릅니다. 그렇다면 내가 예상 한 모든 매개 변수와 값 *을 얻는 방법이 있어야합니다. – stej

+0

당신이 제안한 해결책을 생각해 보라. 코드가'SomeFuncWithManyRequiredParams -p1 $ p1 -p2 $ p2 -p3 $ p3'보다 길다. 그리고'SimplifiedFuncWithDefaultValues' 함수의 모든 매개 변수에 기본값이 있으면 아무런 차이가 없다고 생각합니다. – stej

+0

자동 변수를 통해 원하는 정보를 얻는 방법이 표시되지 않습니다. MS Connect 제안을 제출하는 것이 좋습니다. 귀하의 답변은 –

0

당신은 아래의 Add-Variable 기능과 유사한 도우미 기능을 사용할 수 있습니다 : 어쨌든, 당신은 $의 PSBoundParameters 변수 예를 패치하여이 문제를 해결할 수 있습니다 나는이 질문은 아주 오래 알고

function SimplifiedFuncWithDefaultValues { 
    param(
     [Parameter(Mandatory=$false)][string]$p1='default for p1', 
     [Parameter(Mandatory=$false)][string]$p2='default for p2', 
     [Parameter(Mandatory=$false)][string]$p3='default for p3', 
     ...other parameters 
    ) 

    $PSBoundParameters | Add-Variable p1, p2, p3 

    SomeFuncWithManyRequiredParams @PSBoundParameters 
} 

function Add-Variable { 
    param(
     [Parameter(Position = 0)] 
     [AllowEmptyCollection()] 
     [string[]] $Name = @(), 
     [Parameter(Position = 1, ValueFromPipeline, Mandatory)] 
     $InputObject 
    ) 

    $Name | 
    ? {-not $InputObject.ContainsKey($_)} | 
    % {$InputObject.Add($_, (gv $_ -Scope 1 -ValueOnly))} 
} 
5

을하지만, 나는 최근에 이와 같은 것을 필요로했다. (많은 기본 매개 변수로 splatting을하고 싶었다.) 나는이 함께했다 그리고 그것은 매우 잘 작동 : 앞서

$params = @{} 
foreach($h in $MyInvocation.MyCommand.Parameters.GetEnumerator()) { 
    try { 
     $key = $h.Key 
     $val = Get-Variable -Name $key -ErrorAction Stop | Select-Object -ExpandProperty Value -ErrorAction Stop 
     if (([String]::IsNullOrEmpty($val) -and (!$PSBoundParameters.ContainsKey($key)))) { 
      throw "A blank value that wasn't supplied by the user." 
     } 
     Write-Verbose "$key => '$val'" 
     $params[$key] = $val 
    } catch {} 
} 

뻔뻔 플러그 : 나는 blog post which has more explanation and a sample usage script이 점을 설정하기로 결정했다.

관련 문제