
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 $C
um 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-Host
variável deseja ser fornecida ou apenas gerar um erro que diz que a variável a
ou b
deve ser fornecida.