Die Auflösung des Powershell-Parametersatzes mit explizitem Parameter schlägt fehl

Die Auflösung des Powershell-Parametersatzes mit explizitem Parameter schlägt fehl

Nehmen wir an, ich habe diese Funktion:

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

}

Ich erwarte, dass diese Methode entweder A oder B oder beides erwartet. Niemals keines von beidem.

Wenn ich jedoch Folgendes aufrufe:

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

Der Fehler, den ich bekomme, ist:

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

Ich hatte Probleme, weil ich, wie Sie sehen, den Namen der Parameter explizit angebe.

Wie muss ich meine Funktion schreiben, damit sie wie erwartet funktioniert?

Antwort1

Dann möchten Sie wahrscheinlich eine Parameterprüfung in Ihrer Funktion implementieren. MS sagt, dass Parametersätze einen Parameter haben müssen, der für ihren Parametersatz eindeutig ist. Jeder Parametersatz muss also einen Parameter haben, der zu keinem anderen Parametersatz gehört. Dies ist der Grund für Ihren Fehler beim Versuch, die Funktion mit nur einem Parameter aufzurufen. Sie weiß nicht, welcher Parametersatz zugewiesen werden soll, da der angegebene Parameter nicht eindeutig für einen bestimmten Parametersatz ist. Ich kam dem nahe mit

 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"

}

Ich dachte, dass die Zuweisung $Ceines Standardwerts zu dem erwarteten Verhalten führen würde. Dies ist jedoch nicht der Fall, da der Parameter beim Aufrufen der Funktion explizit deklariert werden muss.

Sie werden feststellen, dass ich den DefaultParameterSetName auf „None“ gesetzt habe. Dadurch haben Sie eine schnelle Möglichkeit, zu prüfen, ob einer der Parameter übermittelt wurde.

Sie könnten beispielsweise prüfen, ob $PsCmdlet.ParameterSetName -eq "None"dann Read-Hostdie gewünschte Variable bereitgestellt wird, oder einfach einen Fehler ausgeben, der besagt, dass entweder die Variable aoder bbereitgestellt werden sollte.

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

verwandte Informationen