4

Допустим, у меня есть эта функция:

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 ответ1

5

Возможно, вы захотите реализовать проверку параметров в своей функции. 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 на "Нет". Это дает вам быструю проверку на случай, если ни один из параметров не был представлен.

Вы можете сделать что-то вроде проверки, если $PsCmdlet.ParameterSetName -eq "None" затем Read-Host какую бы переменную вы не указали, или просто выведите ошибку, которая говорит, что должна быть указана либо переменная a либо b .

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .