2010-10-24 115 views
27

我正在用Powershell寫一個構建腳本。這些腳本執行各種操作,例如獲取最新的源代碼從SVN,備份等,並建立使用MSBuild的解決方案:Powershell腳本中的MSBuild - 如何知道構建是否成功?

cmd /c C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe "C:\Dev\Path\MyProjct.sln" /p:Configuration=Release 

此指令後,我只是想執行腳本,如果其餘編譯成功。我怎樣才能檢查這個?

該項目是一個Web項目,所以檢查輸出並不那麼容易,但我猜測一些變量將包含編譯結果。另外,因爲我用cmd/c調用msbuild,我可以訪問這些變量嗎?

+0

我只是好奇......爲什麼要使用PowerShell腳本做構建?爲什麼不使用MSBuild文件並使用擴展任務庫來執行像從SVN獲取的內容? PowerShell很酷且功能強大,但在某種程度上,您正在採取艱難的方式。 – slugster 2010-10-24 22:33:39

+0

嗯,首先是我並不真正瞭解MSBuild,但我有一個想法,那就是構建工具,並且我可能很難與其他任何東西(SVN,WinRAR,...)交互。對我而言,構建僅佔開發流程的5%,我認爲腳本語言對於其他95%是最合適的。但我很高興錯了。 – 2010-10-24 22:43:40

+2

MSBuild是一個很好的面向任務的依賴工具。使用PowerShell可實現多種場景並支持面向產品的方法。檢查出PSake,我們使用它。當你想擴展事物時,你不必進入C#(MSBuild Tasks)。您只需添加更多PowerShell。 – 2010-10-25 00:09:11

回答

36

在調用MSBUILD後檢查$LastExitCode的值。如果它是0,那麼MSBUILD成功,否則失敗。

順便說一句,沒有必要使用cmd/c。只需直接調用MSBUILD.exe即可。我們始終在PowerShell構建腳本中執行此操作。

+0

當您使用$ LastExitCode時,您如何得到錯誤消息? – Rookian 2014-07-28 12:16:09

+0

您可以捕獲exe的輸出(包括stderr)。這與檢查$ LastExitCode的值是分開的。 – 2014-07-28 19:54:00

+0

我使用C#System.Management.Automation.PowerShell對象並調用同步Invoke方法。問題是錯誤流沒有條目,PowerShell.HadErrors也沒有。 – Rookian 2014-07-29 07:32:53

10

要檢查成功/失敗,請使用自動變量$?

 
PS> help about_Automatic_Variables 


    $? 
     Contains the execution status of the last operation. It contains 
    TRUE if the last operation succeeded and FALSE if it failed. 

例如:

 
msbuild 
if (! $?) { throw "msbuild failed" } 
+5

雖然'$?'在這種情況下起作用,但要知道一些控制檯exes(特別是Microsoft工具)反轉退出代碼邏輯以返回多個成功代碼。所以'$?'在這些前綴上不起作用。 – 2010-10-25 13:40:45

相關問題