在的MSBuild,我怎么运行的东西PowerShell和报告所有的错误[复制](In MsBuil

2019-09-20 04:06发布

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

PowerShell的似乎并不有一个简单的方法用在正确与呼叫者不在PowerShell的互操作的方式任意命令,然后泡了解析和执行错误触发它-例如, cmd.exe , TeamCity的等等。

我的问题很简单。 我与开箱即用的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使一切OK?

Answer 1:

您可以使用下面的例子:

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



Answer 2:

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的版本。

我会得到我的外套。



文章来源: In MsBuild, how do I run something PowerShell and have all errors reported [duplicate]