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