我正在尝试为Get-PSSession编写一个包装程序,以简化SSH远程处理,但我遇到了一个问题,即Powershell内核似乎无法解析传递给'&'运算符的参数中的开关:
$cmd, $args = "dir", ("-Depth", "1", "c:", "d:")
& $cmd $args
$cmd, $args = "dir", @("-Depth", "1", "c:", "d:")
& $cmd $args
$cmd, $args = "dir", ("-Depth:1", "C:", "D:")
& $cmd $args
所有人抱怨
Get-ChildItem : Cannot find path 'C:\...\-Depth' because it does not exist.
做到这一点的唯一方法似乎是对不安全的感觉
Invoke-Expression "& $cmd $args"
但是现在我要确保所有参数都正确转义/引用/等。
在我的最终用例中,参数的数量是可变的:
if ($KeyFilePath) {
$arglist += ("-KeyFilePath", $KeyFilePath)
}
等
有更好的方法吗?有没有一种方法可以确保任何用户提供的参数都正确地用引号/转义,以使恶意用户不能仅仅通过添加自己的转义/引号来绕过它们?有没有办法使用地图/哈希?
答案 0 :(得分:0)
将splat运算符@
用作@args
。
您的包装函数看起来像
function Invoke-MyWrappedCommand {
& /usr/bin/wrappedcommand -MyCustomArg1 Value @args
}
然后可以为速记起别名:
set-alias wrappedcommand invoke-mywrappedcommand
像常规命令一样使用:
PS> wrappedcommand -myarg2 value2
最后一条命令将启动/usr/bin/wrappedcommand -MyCustomArg1 Value -myarg2 value2
PowerShell文档about_Splatting中对此有进一步的说明。