我有一个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)
这里发生了什么?
答案 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