在MsBuild中,如何运行PowerShell并报告所有错误

时间:2012-07-25 11:19:29

标签: powershell error-handling msbuild teamcity msbuild-task

  

可能重复:
  Any good PowerShell MSBuild tasks?

Powershell似乎没有一种简单的方法可以使用任意命令触发它,然后以正确与非PowerShell调用者互操作的方式冒泡解析和执行错误 - 例如cmd.exe,{ {3}}等等。

我的问题很简单。我与开箱即用的MSBuild V4和PowerShell v3的(开到什么是最好的方式建议,难道不排除适当的生产准备MSBuild任务,但它会需要比建议更强一点“这很容易 - 以PowerShell的任务工厂的样品和调整它和/或成为它的维护者/父母“”来运行一个命令(一个小的脚本段,或(最常见的)一个.ps1脚本的调用。

我认为这应该是正常的:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="PowerShell &quot;$(ThingToDo)&quot;" />

遗憾的是,这不起作用: -

  1. 如果ThingToDo无法解析,则会无声地失败
  2. 如果ThingToDo是不存在的脚本调用,则会失败
  3. 如果您想传播基于ERRORLEVEL的{​​{1}}结果,则会变得毛茸茸
  4. 如果您想在.cmd中嵌入"引号,则无法使用
  5. 那么,从MSBuild运行PowerShell的防弹方法是什么?有什么我可以TeamCity让一切都好吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下示例:

<InvokeScript Condition="..."
              PowerShellProperties="..."
              ScriptFile="[PATH TO PS1 FILE]"
              Function="[FUNCTION TO CALL IN PS1]"
              Parameters="..."
              RequiredOutputParams="...">
  <!-- You can catch the output in an Item -->
  <Output TaskParameter="OutputResults"
          ItemName="Output" />
</InvokeScript>

这可以在MSBuild中使用。

答案 1 :(得分:1)

Weeeeelll,你可以使用像这样长篇大论的东西,直到找到更好的方法: -

<PropertyGroup>
  <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
  <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
  <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
  <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</PsCmdStart>
  <_PsCmdEnd>$(__BlockEnd)"</PsCmdEnd>
</PropertyGroup>

然后你需要做的就是“全部”:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />

这个的单一兑换功能(除了捕获我能想到的所有错误类型除外)是它可以在任何PowerShell版本和任何MSBuild版本上运行OOTB。

我会得到我的外套。