La resolución del conjunto de parámetros de Powershell con parámetros explícitos falla

La resolución del conjunto de parámetros de Powershell con parámetros explícitos falla

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 $Cun 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-Hostproporciona la variable que desea, o simplemente generar un error que diga que se debe proporcionar cualquier variable ao .b

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

información relacionada