如何在PowerShell中将参数作为-file的一部分传递

时间:2018-08-16 15:51:35

标签: powershell quoting start-process

如果我在PowerShell窗口中运行此行,它将完美执行

.\buildTestAndPublish.ps1 -buildPath 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0' -testPath 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TestWindow'

现在我需要使它自动化,但我没有做到

$pth = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0'
$testPth = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TestWindow' 
start-process powershell -Verb runAs -ArgumentList "-file $PSScriptRoot\AutomationScripts\buildTestAndPublish.ps1 -buildPath $pth -testPath $testPth"
  

找不到接受参数Files的位置参数

这似乎是在抱怨空白,但是在搜索之后,我将它们用单引号引起来并将它们作为变量传递(我在网上找到的建议)

我需要做什么?

1 个答案:

答案 0 :(得分:3)

在可能包含空格的参数周围使用嵌入双引号 ;在"..."内,"嵌入`" ,因为`后退标记字符 [1 ] ,是PowerShell的转义字符:

"-file $PSScriptRoot\buildTestAndPublish.ps1 -buildPath `"$pth`" -testPath `"$testPth`""

注意:缩短*.ps1路径以提高可读性。

注意:在这种情况下,嵌入 引号('...'有效 ,因为将PowerShell CLI与 -File一起使用不会将单引号识别为字符串定界符;相比之下,-Command可以识别它们。 [2]


请注意,您可以单独地将参数 作为数组 传递给-ArgumentList
但是,由于a known bug ,您必须仍然应用嵌入式双引号

Start-Process powershell -Verb runAs -ArgumentList '-file',
  $PSScriptRoot\AutomationScripts\buildTestAndPublish.ps1,
  '-buildPath',
  "`"$pth`"",
  '-testPath',
  "`"$testPth`""

[1]正式称为GRAVE ACCENT, Unicode code point U+0060

[2]这样,您可以使用-Command代替-File,这将启用以下解决方案:
"-Command $PSScriptRoot\buildTestAndPublish.ps1 -buildPath '$pth' -testPath '$testPth'",但(a)'是文件名中的合法字符(而"不是),并且文件名中'的存在将破坏命令; (b)-Command将自变量视为PowerShell代码,这可能导致其他不必要的解释(相反,-File将其自变量视为 literals )。