
Digamos que tengo esta función:
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, B o ambos. Nunca ninguno.
Sin embargo, si llamo a esto:
Foo -A 1 -B 2 # outputs "both" as expected
Foo -B 3 # error
Foo -A 4 # error
El error que me sale es:
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
Me preocupé porque, como puede ver, especifico explícitamente el nombre de los parámetros.
¿Cómo debo escribir mi función para que funcione como se esperaba?
Respuesta1
Entonces probablemente quieras implementar la verificación de parámetros en tu función. MS dice que los conjuntos de parámetros deben tener un parámetro que sea exclusivo de su conjunto de parámetros. Entonces, cada conjunto de parámetros debe tener un parámetro que no pertenezca a ningún otro conjunto de parámetros, lo cual es el motivo de su error al intentar llamar a la función con solo un parámetro, no sabe qué conjunto de parámetros asignar b/ c el parámetro proporcionado no es exclusivo de un conjunto de parámetros en particular. estuve cerca de
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"
}
Pensé que asignar $C
un valor predeterminado daría el comportamiento esperado, pero no es así porque el parámetro debe declararse explícitamente al llamar a la función.
Notarás que configuré DefaultParameterSetName en "Ninguno". Lo que esto hace es brindarle una forma rápida de verificar el caso si no se envió ninguno de los parámetros.
Podría hacer algo como verificar si $PsCmdlet.ParameterSetName -eq "None"
se Read-Host
proporciona la variable que desea, o simplemente generar un error que diga que se debe proporcionar cualquier variable a
o .b