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

4

Digamos que eu tenha essa 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 esse método espere A ou B ou ambos. Nunca nenhum.

No entanto, se eu ligar para 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

Eu me preocupei, porque, como você pode ver, eu especifico explicitamente o nome dos parâmetros.

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

    
por Steve B 09.01.2013 / 15:12

1 resposta

5

Você provavelmente quer implementar a verificação de parâmetros em sua função. MS diz que os conjuntos de parâmetros precisam ter um parâmetro exclusivo para seu conjunto de parâmetros. Assim, cada conjunto de parâmetros deve ter um parâmetro que não pertença 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 para atribuir b / c o parâmetro fornecido não é exclusivo de um determinado conjunto de parâmetros. 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"

}

Eu pensei que atribuir $C a um valor padrão daria o seu comportamento esperado, mas não b / c o parâmetro deve ser declarado explicitamente ao chamar a função.

Você notará que eu defini o DefaultParameterSetName como "None". O que isto faz é dar-lhe um rápido foi verificar o caso se nenhum parâmetro foi submetido.

Você poderia fazer algo como verificar se $PsCmdlet.ParameterSetName -eq "None" , em seguida, Read-Host qualquer variável que você deseja fornecer, ou apenas gerar um erro informando que a variável a ou b deve ser fornecida.

link

    
por 09.01.2013 / 17:28

Tags