使powershell不要在参数周围放置双引号

时间:2016-09-07 09:19:36

标签: powershell

我想执行这样的外部程序

& $exe $arguments

$ arguments是带空格的字符串,比如说a b c d

传递给exe的参数是什么? "a b c d"

用双引号括起来。当$ arguments不包含空格时,不会发生这种情况。

如何阻止PowerShell尝试变聪明并阻止它将我的字符串用双引号括起来?假设所有带空格的东西必须是一条路径,这是荒谬的。

编辑:由于修复程序不存在,我确实通过将每个位转换为数组来解决问题,并且它在PS 5中工作。但PS4正在**** ...

我想要的是拥有一个看起来像的命令行参数 -filter:"+[RE*]* +[RR*]*"

PS 4也引用了双引号: $filter = "+[RE*]*", "+[RR*]*" & $opencover -target:"$xunit" "-targetargs:$allPaths $traitsCmd -quiet -nunit xunit-$results -noshadow" -register:user -filter:"$filter" -output:opencover-$results

如果我用' -filter:'替换-filter:我最终得到-filter:和$ filter数组的内容之间的空格。无论我做什么,我都可以摆脱它,而不是将整个事物包装成双引号,例如" -filter:......"

4 个答案:

答案 0 :(得分:1)

你应该制作一个数组而不是尝试。 所以在你的情况下:

$exe = "ping.exe"
$arguments = "-t","8.8.8.8"
& $exe $arguments

请注意,$args是一个特殊值,无法分配给任何内容。这就是为什么我在我的例子中使用$arguments

你的问题的答案是:

$arguments = "a","b","c","d"
& $exe $arguments

答案 1 :(得分:0)

将以空格分隔的字符串拆分为数组:

$arguments = "a b c d"
$arguments = $arguments -split '\.'
& $exe $arguments

答案 2 :(得分:0)

我强烈建议您使用Start-Process而不是.&调用运算符,以便从PowerShell调用外部可执行文件。

Start-Process命令更容易预测,因为您分别在可执行文件和命令行参数的路径中提供。这种方式没有任何特殊的解释(又称“魔法”)。

$MyProcess = Start-Process -FilePath $exe -ArgumentList $arguments -Wait

我在其他几个StackOverflow线程上分享了类似的建议。

Powershell "Start-process" not running as scheduled task

Accessing output from Start-Process with -Credential parameter

答案 3 :(得分:0)

将复杂参数传递给exe时,请考虑使用stop parsing运算符:--%。从该运算符到行尾,PowerShell解析“功能”消失,文本解析与CMD解析文本的方式非常相似。实际上,引用变量的唯一方法是CMD方式%var%,例如:

77> $env:arguments = 'a b c d'
78> echoargs --% %arguments%
Arg 0 is <a>
Arg 1 is <b>
Arg 2 is <c>
Arg 3 is <d>

Command line:
"C:\Users\Keith\Documents\WindowsPowerShell\Modules\Pscx\3.2.2\Apps\EchoArgs.exe"  a b c d