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

ano*_*opb 8 c# powershell command-line-arguments

我在c#中编写了一个powershell模块,它有一堆像cmd一样的cmdlet

添加-VM

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

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

例如

newtask addvm -id 12345
Run Code Online (Sandbox Code Playgroud)

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

Invoke-Expression Add-VM $argstr
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

提前致谢.

get*_*eal 8

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

Invoke-Expression "Add-VM `$argstr"
Run Code Online (Sandbox Code Playgroud)


Mik*_*ray 4

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

Invoke-Expression "Add-VM $argstr"
Run Code Online (Sandbox Code Playgroud)

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

function newtask {
    params([string]$command)

    switch ($command) {
        "addvm" { Add-VM @args }
        "deletevm" { Remove-VM @args }
    }
}
Run Code Online (Sandbox Code Playgroud)