在Powershell中使用参数调用Invoke-Expression

时间:2014-10-28 18:20:13

标签: c# powershell command-line-arguments

我在c#中编写了一个powershell模块,它有一堆cmdlet,比如

...添加-VM

cmdlet可以访问API并将数据拉回来。

但是为了与产品的ssh CLI保持一致,我编写了一个名为newtask的函数,它接受'addvm'作为参数和$ args。

例如

newtask addvm -id 12345

然后我调用Add-VM并将$ args作为字符串传递,如此

Invoke-Expression Add-VM $argstr

问题是Add-VM抛出一个错误,它找不到接受参数的位置参数System.Object []

  

无法找到接受参数'System.Object []'

的位置参数

虽然我可以轻松地将“addvm”别名为“Add-VM”,但我正在尝试使用ssh CLI保持一致性,以便新用户可以快速开始使用此模块。

我认为发送像'-id 12345'这样的字符串就足够了,但事实并非如此。 pscmdlet是否希望收到其他内容?

提前致谢。

2 个答案:

答案 0 :(得分:3)

我知道现在有点老了,但我遇到了类似的问题,同事告诉我逃避$ argstr会阻止对象转换为字符串。

Invoke-Expression "Add-VM `$argstr"

答案 1 :(得分:2)

该错误来自Invoke-Expression而非Add-VM,您只需要围绕参数引用:

Invoke-Expression "Add-VM $argstr"

这具有将所有对象强制为字符串格式的缺点。对于像int和字符串这样的简单类型,这可能是可以接受的,但是如果你想通过一个更复杂的对象,它将无法工作。另一种方法是使用@args来展开参数,但我不认为你可以通过Invoke-Expression或Invoke-Command来做到这一点。您需要直接调用cmdlet:

function newtask {
    params([string]$command)

    switch ($command) {
        "addvm" { Add-VM @args }
        "deletevm" { Remove-VM @args }
    }
}