Befehl mit einer unbekannten Anzahl von Parametern in PowerShell aufrufen/ausführen

Befehl mit einer unbekannten Anzahl von Parametern in PowerShell aufrufen/ausführen

Möchten Sie mit Parametern ausführen Invoke-Expression, die je nach Eingabe variieren können

Ich habe ein Problem mit $MyArgsder 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 zu Invoke-Expressionkann er gebundene Parameter verarbeiten, ohne alles in eine Zeichenfolge umzuwandeln.
  • Die $PSBoundParametersVariable 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-ExpressionAufruf durch Folgendes: Wir rufen ein Cmdlet auf, dessen Name dem Namen des Parametersatzes entspricht, und übergeben ihm alle Parameter der Funktion:

& $PSCmdlet.ParameterSetName @PSBoundParameters

verwandte Informationen