2014-07-18 103 views
2

從PowerShell中命令行的MSBuild多DefineConstants

Set-Alias msbuild C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe 

,並從同一目錄中運行我的SLN文件

> msbuild /nologo /property:DefineConstants=FOO 

的作品就好了。假設我需要兩個編譯時間常量。

> msbuild /nologo /property:DefineConstants=FOO;BAR 

Powershell的解釋分號作爲末端陳述的和具有單個恆定運行,然後嘗試運行命令BAR和錯誤。所以不是我想要的。

怎麼樣?

> msbuild /nologo /property:DefineConstants="FOO;BAR" 
MSBUILD : error MSB1006: Property is not valid. 
Switch: BAR 

這也行不通。不知道這裏發生了什麼,但它似乎將「FOO; BAR」解釋爲某種單一的東西 - 而不是兩個常量。

所以。我如何實際傳遞多個常量?

編輯 經進一步調查,我跑在cmd.exe的

>C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /property:DefineConstants=FOO;BAR 
MSBUILD : error MSB1006: Property is not valid. 
Switch: BAR 

以下雖然這工作

>C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe /nologo /property:DefineConstants="FOO;BAR" 

回答

5

兩個想法:

周圍添加引號財產標誌和逃避雙引號

msbuild /nologo "/property:DefineConstants=`"FOO;BAR`"" 

使用電話運營商&(工作在PS V4 +)

& msbuild /nologo /property:DefineConstants="FOO;BAR" 
+0

感謝邁克!第一個選項奏效。 –

+0

應該注意的是,雖然這適用於「DefineConstants」屬性,但它會針對路徑中包含空格的路徑進行分解。所以在這種情況下不要使用這個技巧。 –

+0

@GeorgeMauer命令行工具的字符串轉義是PowerShell難以使用的領域之一。我注意到,第二個選項在4.0版本上適用於我,但不是3.0版本。 –