A resolução do conjunto de parâmetros do Powershell com parâmetro explícito falha

A resolução do conjunto de parâmetros do Powershell com parâmetro explícito falha

Digamos que eu tenha esta função:

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

}

Espero que este método espere A, ou B ou ambos. Nunca nenhum.

No entanto, se eu chamar isso:

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

O erro que recebo é:

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

Fiquei preocupado porque, como você pode ver, especifico explicitamente o nome dos parâmetros.

Como devo escrever minha função para funcionar conforme o esperado?

Responder1

Você provavelmente deseja implementar a verificação de parâmetros em sua função. MS diz que os conjuntos de parâmetros devem ter um parâmetro exclusivo para seu conjunto de parâmetros. Portanto, cada conjunto de parâmetros deve ter um parâmetro que não pertence a nenhum outro conjunto de parâmetros, que é o motivo do seu erro ao tentar chamar a função com apenas um parâmetro, ele não sabe qual conjunto de parâmetros atribuir b/ c o parâmetro fornecido não é exclusivo de um conjunto de parâmetros específico. cheguei perto com

 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"

}

Achei que atribuir $Cum valor padrão daria o comportamento esperado, mas não porque o parâmetro precisa ser declarado explicitamente ao chamar a função.

Você notará que defini DefaultParameterSetName como "None". O que isso faz é verificar rapidamente se nenhum dos parâmetros foi enviado.

Você poderia fazer algo como verificar se $PsCmdlet.ParameterSetName -eq "None"alguma Read-Hostvariável deseja ser fornecida ou apenas gerar um erro que diz que a variável aou bdeve ser fornecida.

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

informação relacionada