1

可能重复:
任何好的 PowerShell MSBuild 任务?

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

我的问题很简单。使用 OOTB MSBuild v4 和 PowerShell v3 对我来说最好的方法是什么(接受建议 - 不会排除适合生产的 MSBuild 任务,但它需要比建议“这很容易 - 使用 PowerShell 任务工厂示例和调整它和/或成为它的维护者/父”)来运行一个命令(一个小的脚本段,或者(最常见的)一个.ps1脚本的调用。

我认为它应该是正常的,例如:

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

可悲的是,这不起作用:-

  1. 如果ThingToDo解析失败,则静默失败
  2. 如果ThingToDo是不存在的脚本调用,则失败
  3. 如果你想传播一个ERRORLEVEL基于.cmd结果的结果,它会变得毛茸茸的
  4. 如果你想在 中嵌入"引号ThingToDo,它将不起作用

那么,从 MSBuild 运行 PowerShell 的防弹方法应该是什么?有什么我可以PsGet让一切正常的吗?

4

2 回答 2

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 中使用。

于 2012-10-10T07:12:34.230 回答
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。

我去拿我的外套。

于 2012-07-25T11:19:29.043 回答