명시적 매개변수를 사용한 Powershell 매개변수 세트 확인이 실패함

명시적 매개변수를 사용한 Powershell 매개변수 세트 확인이 실패함

이 기능이 있다고 가정 해 봅시다.

function Foo{
    [CmdLetBinding()]
    param(
        [Parameter(Mandatory=$true,ParameterSetName="A",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=0)] 
        [int]
        $A,

        [Parameter(Mandatory=$true,ParameterSetName="B",Position=0)] 
        [Parameter(Mandatory=$true,ParameterSetName="both",Position=1)] 
        [int]
        $B
    )

    Write-Host $PsCmdlet.ParameterSetName

}

나는 이 방법이 A나 B 또는 둘 다를 기대한다고 예상합니다. 결코 아무것도.

그러나 내가 이것을 호출하면 :

Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error

내가 얻는 오류는 다음과 같습니다.

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto:75 char:4
+ Foo <<<<  -B 3
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

Foo : Parameter set cannot be resolved using the specified named parameters.
At c:\pathto.ps1:76 char:4
+ Foo <<<<  -A 4
    + CategoryInfo          : InvalidArgument: (:) [Foo], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Foo

보시다시피 매개변수 이름을 명시적으로 지정하기 때문에 고민했습니다.

예상대로 작동하려면 함수를 어떻게 작성해야 합니까?

답변1

그러면 아마도 함수에서 매개변수 검사를 구현하고 싶을 것입니다. MS에서는 매개 변수 집합에 해당 매개 변수 집합에 고유한 하나의 매개 변수가 있어야 한다고 말합니다. 따라서 각 매개변수 세트에는 다른 매개변수 세트에 속하지 않는 하나의 매개변수가 있어야 합니다. 이는 하나의 매개변수만 사용하여 함수를 호출하려고 할 때 오류가 발생하는 이유입니다. b/ 할당할 매개변수 세트를 알 수 없습니다. c 제공된 매개변수는 특정 매개변수 세트에 고유하지 않습니다. 나는 가까이 다가왔다

 function Foof{
[CmdLetBinding(DefaultParameterSetName="None")]
param(

    [Parameter(Mandatory=$false,ParameterSetName="A")]
    [Parameter(Position=0)]
    [int]
    $A,

    [Parameter(Mandatory=$false,ParameterSetName="B")]
    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [Parameter(Position=1)]
    [int]
    $B,

    [Parameter(Mandatory=$false,ParameterSetName="both")]  
    [int]
    $C=$true

)

Write-Host $PsCmdlet.ParameterSetName
write-host "A=$A and B=$B and C=$C"

}

기본값을 할당하면 예상되는 동작이 제공될 것이라고 생각했지만 $C함수를 호출할 때 매개 변수를 명시적으로 선언해야 한다는 뜻은 아닙니다.

DefaultParameterSetName을 "None"으로 설정한 것을 알 수 있습니다. 이것이 하는 일은 매개변수가 모두 제출되지 않은 경우를 확인하는 것입니다.

$PsCmdlet.ParameterSetName -eq "None"제공하려는 변수가 무엇 인지 확인하거나 변수 또는 제공해야 한다는 Read-Host오류를 출력하는 등 의 작업을 수행할 수 있습니다 .ab

http://technet.microsoft.com/en-us/library/hh847743.aspx

관련 정보