运行带有动态参数列表的命令

时间:2019-05-03 20:49:20

标签: powershell-core

我正在尝试为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)
}

有更好的方法吗?有没有一种方法可以确保任何用户提供的参数都正确地用引号/转义,以使恶意用户不能仅仅通过添加自己的转义/引号来绕过它们?有没有办法使用地图/哈希?

1 个答案:

答案 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中对此有进一步的说明。