为什么此PowerShell与符号命令中的参数解释不正确?
我有一个PowerShell脚本,如下所示:为什么此PowerShell与符号命令中的参数解释不正确?,powershell,msbuild,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"
[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
& .\Build.ps1 -MSBuildParameters "/p:DeployOnBuild=true /p:PublishProfile=MyProfile"
是来自$MSBuild
Get命令“MSBuild.exe”
是指向$Solution
或.sln
文件的路径.csproj
包含要在命令行上逐字传递的零个或多个参数$MSBuildParameters
[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
& .\Build.ps1 -MSBuildParameters "/p:DeployOnBuild=true /p:PublishProfile=MyProfile"
但是,当命令执行时,MSBuild会出现以下错误:
错误MSB4100:应将“$(_DeployOnBuild)”计算为布尔值,而不是“true/p:Publ”
ishProfile=FolderProfile”,条件“$(PipelineDeployPhaseAfterTargets)”为==''和$(\u DeployOnBuild)
这是怎么回事?如果这是您的目标,我建议您尝试一组字符串并将它们连接起来 e、 g
始终存在一种
Invoke Expression
方法,即构建命令字符串,然后将字符串作为表达式调用。类似于:
[CmdletBinding()]
param(
# Other parameters removed for brevity
[string] $MSBuildParameters = ""
)
# Other syntax removed for brevity
$cmd = "& `$MSBuild '$Solution' /p:Configuration=$Configuration /p:Platform=`"$BuildPlatform`" /nologo /m /v:m /nr:false $MSBuildParameters"
Invoke-Expression $cmd
这样,您的字符串将预先展开,其行为应该与手动键入字符串时的行为相同。请注意,我确实转义了
$MSBuild
对象以及内部引号,以便保留它们,并且我在解决方案路径周围添加了单引号,以防它有空格。您可能需要对保留和添加的引号进行了调整。如果这些命令行参数是显式编写的,而不是通过$MSBuildParameters
传入的,则可能值得注意。您是否尝试过将其作为字符串数组(&.\Build.ps1-MSBuildParameters)/p:DeployOnBuild=true“,”/p:PublishProfile=MyProfile“
),并将参数更改为[string[]]$MSBuildParameters
?@TheMadTechnician的行为与问题中描述的相同。这会导致更多的问题。我已经完成了,但现在MSBuild.exe阻塞了$Solution参数中的一个空格。@带空格的Kivin参数应被引用为单个参数。我使用的确切表达式是$MSBuildCommand=”&$MSBuild'$Solution'/p:Configuration=$Configuration/p:Platform='$BuildPlatform'/nologo/m/v:m/nr:false$MSBuildParameters“
,这有效。标记为答案。