2010-10-24 72 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

相关问题