PowerShell で、パラメータ数が不明なコマンドを呼び出し/実行する

PowerShell で、パラメータ数が不明なコマンドを呼び出し/実行する

Invoke-Expression入力に応じて変化するパラメータで実行したい

$MyArgsロジックに問題があります。入力されたパラメータのみを含める必要があります

入力(例):

./foo.ps1 -Name aa -Server bb -Datastore cc

出力:

Get-VM -Name aa -Server bb -Datastore cc

コード:

    [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

答え1

ここでは、3 つの PowerShell 機能を使用します。

  • 呼び出し演算子 は&、式で名前を指定できるコマンドを呼び出します。 とは異なりInvoke-Expression、すべてを文字列化せずにバインドされたパラメータを処理できます。
  • 変数$PSBoundParametersは、現在のコマンドレットに指定されたパラメーターとその値のハッシュテーブルです。
  • スプラッティングは の逆のようなものです$PSBoundParameters。つまり、ハッシュテーブルをコマンドレットへのバインドされたパラメーターとして使用します。

これらすべてをまとめると、呼び出しを次のように置き換えInvoke-Expression、名前がパラメータ セット名であるコマンドレットを呼び出して、関数のすべてのパラメータを渡します。

& $PSCmdlet.ParameterSetName @PSBoundParameters

関連情報