2017-06-22 45 views
2

我有一個PowerShell腳本是如下:爲什麼在此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 
  • $MSBuildGet-Command "MSBuild.exe"
  • $SolutionApplicationInfo一個實例是一個.sln.csproj文件的路徑。
  • $MSBuildParameters包含零個或多個要逐字傳遞給命令行的參數。

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

    然而,當命令執行時,MSBuild的blaps,出現以下錯誤:

    error MSB4100: Expected "$(_DeployOnBuild)" to evaluate to a boolean instead of "true /p:Publ ishProfile=FolderProfile", in condition "'$(PipelineDeployPhaseAfterTargets)' == '' And $(_DeployOnBuild)

    這是怎麼回事

的$ MSBuildParameters變量如下從另一個PowerShell腳本中傳遞在這?

+0

也許值得注意的是,如果這些命令行參數是顯式編寫的,而不是通過$ MSBuildParameters傳入,那麼這些命令行參數可以正常工作。 – Kivin

+0

您是否嘗試過將它作爲字符串數組傳遞('&。\ Build.ps1 -MSBuildParameters「/ p:DeployOnBuild = true」,「/ p:PublishProfile = MyProfile」'),並將參數更改爲'[string [ ]] $ MSBuildParameters'? – TheMadTechnician

+0

@ TheMadTechnician與問題中描述的行爲相同。 – Kivin

回答

2

總是有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對象以及內部引號,因此它們將保留原樣,並且在解決方案路徑中添加了單引號,以防有空格。您可能需要對我保留和添加的報價進行調整。

+0

我使用的確切表達式是$ MSBuildCommand =&$ MSBuild'$ Solution'/ p:Configuration = $ Configuration/p:Platform ='$ BuildPlatform'/ nologo/m/v:m/nr:false $ MSBuildParameters「 ',這工作。標記爲答案。 – Kivin

1

如果這是你的目標,我建議嘗試一串字符串並加入它們。

例如

[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 
+0

這造成了更多的麻煩。我已經完成了[this](https://pastebin.com/m965FZKd),但現在MSBuild.exe在$ Solution參數中的空格上徘徊。 – Kivin

+0

@Kivin帶空格的參數應引用以解釋爲單個參數。 – TheIncorrigible1

相關問題