我想执行这样的外部程序
& $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:......"
答案 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