Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么此PowerShell与符号命令中的参数解释不正确?_Powershell_Msbuild - Fatal编程技术网

为什么此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"

我有一个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
& .\Build.ps1 -MSBuildParameters "/p:DeployOnBuild=true /p:PublishProfile=MyProfile"
  • $MSBuild
    是来自
    Get命令“MSBuild.exe”
  • $Solution
    是指向
    .sln
    .csproj
    文件的路径
  • $MSBuildParameters
    包含要在命令行上逐字传递的零个或多个参数
$MSBuildParameters变量是从另一个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
& .\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“
,这有效。标记为答案。