
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 $C
eines 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-Host
die gewünschte Variable bereitgestellt wird, oder einfach einen Fehler ausgeben, der besagt, dass entweder die Variable a
oder b
bereitgestellt werden sollte.