在 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

我们将使用三个 PowerShell 功能:

  • 调用运算&符 调用一个命令,该命令的名称可以通过表达式指定。与 不同Invoke-Expression,它可以处理绑定参数,而无需将所有内容字符串化。
  • $PSBoundParameters变量是指定给当前 cmdlet 的参数及其值的哈希表。
  • 溅射就像相反的$PSBoundParameters:它使用哈希表作为 cmdlet 的绑定参数。

综合起来,我们用Invoke-Expression这个替换您的调用,调用一个以参数集名称为名称的 cmdlet,并将所有函数的参数传递给它:

& $PSCmdlet.ParameterSetName @PSBoundParameters

相关内容