2015-06-10 36 views
1

我創建了一個PowerShell腳本部署以下斯科特Guthrie的例子我的web應用程序在這裏解釋Automate Everything (Building Real-World Cloud Apps with Azure) 使用這個MSBuild的調用來構建和發佈的Web應用程序運行的MSBuild從PowerShell中沒有指定.NET版本

& "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" $ProjectCsproj ` 
/p:VisualStudioVersion=12.0 ` 
/p:DeployOnBuild=true ` 
/p:PublishProfile=$PublishXmlFile ` 
/p:Password=$Password 

由於你可以看到這個示例假設.Net框架版本4.0.30319,並且將在其他版本(或未來的.Net安裝)中失敗。

有沒有一種方法可以運行此MSBuild命令而不會假設任何特定的.Net版本?

回答

3

您可能希望從Powershell本身查找所需的.NET構建器,因爲它在基本命令集中具有足夠的工具。如果您使用其他版本的.NET Framework來構建項目,比如缺少或過時的/不推薦的類,屬性,方法,或者可能會導致項目無法成爲語法或類依賴關係的更改,則可能會有技巧在新的.NET版本下正確構建。但是,您可以嘗試枚舉構建器並找到最接近v4.0.30319的構建器。舉個例子:

$builders= get-childitem "$env:windir\Microsoft.NET" -recurse -filter "MSBuild.exe" 
$builders | select -expand FullName 

此時將顯示可用MSBuild.exe文件名,可以有資格建立你的項目。然後,解析FrameworkFrameWork64以獲取64位或32位構建器,然後使用您喜歡的任何算法從列表中進行選擇。 (我懷疑你是否會需要這個技巧)

+0

是的,Get-ChildItem中的-filter參數比使用ForEach-Object更快。 –

1

你可以找到可供MsBuild.exe文件,這樣

Dir $env:windir\Microsoft.NET\Framework -Recurse -File | ? {$_.Name -like "MSBuild.exe"} | Resolve-Path 

這oneliner甚至更多,如果你設置的目錄名的其他限制進行優化。

然後你可以在這裏實現你自己選擇版本的邏輯,當沒有任何東西被發現時,你可以運行它。例如,您可以使用正則表達式和/或使用路徑的.NET函數來選擇最新版本。

+0

有趣的是,我不知道'dir'是'Get-ChildItem'的別名,我現在檢查之前。 – Vesper

+0

它實際上在Windows管理員中很普遍。一般來說,在腳本中使用別名或者當你回答問題時是一種糟糕的風格,但是Dir實際上是一個例外) –

相關問題