Möchten Sie mit Parametern ausführen Invoke-Expression
, die je nach Eingabe variieren können
Ich habe ein Problem mit $MyArgs
der Logik. Es sollten nur eingegebene Parameter enthalten sein.
Eingabe (Beispiel):
./foo.ps1 -Name aa -Server bb -Datastore cc
Ausgabe:
Get-VM -Name aa -Server bb -Datastore cc
Code:
[cmdletbinding(DefaultParameterSetName='Get-VM')]
Param(
#Common params
[Parameter(ParameterSetName='Get-VM')]
[Parameter(ParameterSetName='Get-Datastore')]
[Parameter(Position = 0)]
[String]$Name,
[Parameter(ParameterSetName='Get-VM')]
[Parameter(ParameterSetName='Get-Datastore')]
[Parameter(Position = 1)]
[String]$Server,
#Get-VM params
[Parameter(ParameterSetName='Get-VM')]
[String]$Datastore,
[Parameter(ParameterSetName='Get-VM')]
.
.
.
#Get-Datastore params
[Parameter(ParameterSetName='Get-Datastore')]
[String]$Datacenter,
.
.
.
)
Invoke-Expression -Command "$PSCmdlet.ParameterSetName $MyArgs" \\ <--- here is my problem
Antwort1
Wir werden drei PowerShell-Funktionen verwenden:
- Der Aufrufoperator
&
ruft einen Befehl auf, dessen Name durch einen Ausdruck angegeben werden kann. Im Gegensatz zuInvoke-Expression
kann er gebundene Parameter verarbeiten, ohne alles in eine Zeichenfolge umzuwandeln. - Die
$PSBoundParameters
Variable ist eine Hashtabelle der für das aktuelle Cmdlet angegebenen Parameter und ihrer Werte. - Spritzenist wie das Gegenteil von
$PSBoundParameters
: es verwendet eine Hashtabelle als gebundene Parameter für ein Cmdlet.
Zusammenfassend ersetzen wir Ihren Invoke-Expression
Aufruf durch Folgendes: Wir rufen ein Cmdlet auf, dessen Name dem Namen des Parametersatzes entspricht, und übergeben ihm alle Parameter der Funktion:
& $PSCmdlet.ParameterSetName @PSBoundParameters