为什么在此PowerShell&符号命令中错误地解释了参数?

时间:2017-06-22 17:14:09

标签: powershell msbuild

我有一个PowerShell脚本,如下所示:

[CmdletBinding()]
param(
    # Other parameters removed for brevity
    [string] $MSBuildParameters = ""
)
# Other syntax removed for brevity
& $MSBuild $Solution /p:Configuration=$Configuration /p:Platform="$BuildPlatform" /nologo /m /v:m /nr:false $MSBuildParameters
  • $MSBuild是来自ApplicationInfo
  • Get-Command "MSBuild.exe"的实例
  • $Solution.sln.csproj文件的路径。
  • $MSBuildParameters包含零个或多个要在命令行上逐字传递的参数。

$ MSBuildParameters变量从另一个PowerShell脚本传入,如下所示:

& .\Build.ps1 -MSBuildParameters "/p:DeployOnBuild=true /p:PublishProfile=MyProfile"

但是,当命令执行时,MSBuild会发出以下错误:

  

错误MSB4100:期望“$(_ DeployOnBuild)”评估为布尔值而不是“true / p:Publ”   ishProfile = FolderProfile“,条件为''$(PipelineDeployPhaseAfterTargets)'==''和$(_ DeployOnBuild)

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

始终使用$MSBuild方法构建命令字符串,然后将字符串作为表达式调用。类似的东西:

{{1}}

这样你的字符串就会被预先扩展,它应该像你手动输入它一样。请注意,我确实转义了{{1}}对象以及内部引号,因此它们将按原样保留,并且我在解决方案路径周围添加了单引号,以防它有空格。您可能需要调整我保留和添加的报价。

答案 1 :(得分:1)

如果这是你的目标,我建议尝试一系列字符串并加入它们。

e.g。

[CmdletBinding()]
param(
  # Other parameters removed for brevity
  [string] $MSBuildParameters = ""
)
# Other syntax removed for brevity
$params = @("$solution", "/p:Configuration=$Configuration", "/p:Platform=$BuildPlatform", "nologo", "/m", "/v:m", "/nr:false", "$MSBuildParameters")
$params = $params -join " "
& "$MSBuild" $params