在Powershell中调用带参数的InvokeExpression

本文关键字:参数 InvokeExpression 调用 Powershell | 更新日期: 2023-09-27 18:28:20

我用c#编写了一个powershell模块,它有一堆类似的cmdlet

添加VM

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

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

例如

newtask addvm -id 12345

然后我调用AddVM并将$args作为字符串传递,就像一样

Invoke-Expression Add-VM $argstr

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

找不到接受参数"System.Object[]"的位置参数

虽然我可以很容易地将"addvm"别名为"addvm",但我正在努力与ssh CLI保持一致性,以便新用户可以快速开始使用此模块。

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

提前谢谢。

在Powershell中调用带参数的InvokeExpression

我知道这有点过时了,但我也遇到了类似的问题,一位同事向我展示了转义$argstr可以防止对象转换为字符串。

Invoke-Expression "Add-VM `$argstr"

该错误来自Invoke-Expression而非Add-VM,您只需要在参数周围加引号:

Invoke-Expression "Add-VM $argstr"

这样做的缺点是将所有对象强制转换为字符串格式。这对于像int和字符串这样的简单类型来说可能是可以接受的,但如果你想通过一个更复杂的对象,它就不起作用了。另一种选择是用@args来填充参数,但我认为不能通过InvokeExpression或InvokeCommand来实现。您需要直接调用cmdlet:

function newtask {
    params([string]$command)
    switch ($command) {
        "addvm" { Add-VM @args }
        "deletevm" { Remove-VM @args }
    }
}