希望使用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
我们将使用三个 PowerShell 功能:
- 调用运算
&
符 调用一个命令,该命令的名称可以通过表达式指定。与 不同Invoke-Expression
,它可以处理绑定参数,而无需将所有内容字符串化。 - 该
$PSBoundParameters
变量是指定给当前 cmdlet 的参数及其值的哈希表。 - 溅射就像相反的
$PSBoundParameters
:它使用哈希表作为 cmdlet 的绑定参数。
综合起来,我们用Invoke-Expression
这个替换您的调用,调用一个以参数集名称为名称的 cmdlet,并将所有函数的参数传递给它:
& $PSCmdlet.ParameterSetName @PSBoundParameters