我在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是否希望收到其他内容?
提前致谢。
答案 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 }
}
}