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是否希望收到其他内容?
提前致谢.
我知道这现在有点旧了,但是我遇到了类似的问题,一位同事向我展示了转义 $argstr 可以防止对象转换为字符串。
Invoke-Expression "Add-VM `$argstr"
Run Code Online (Sandbox Code Playgroud)
该错误来自 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)
| 归档时间: |
|
| 查看次数: |
14678 次 |
| 最近记录: |