任何好的PowerShell MSBuild任务?

Eri*_*ver 5 msbuild powershell visual-studio

任何人都知道任何好的MSBuild任务将执行PowerShell脚本并传递不同的参数?

我能够找到B#.NET博客:从MSBuild调用PowerShell脚本,但我希望有一些更精致的东西.

如果我找不到任何东西,我当然会继续使用该博客作为首发来磨练自己.

Ste*_*ski 7

您可能还想看看Psake - 一个基于PowerShell的构建环境.


Rub*_*ink 5

我发布了重复的问题和答案,供后代在投票结束时使用。关键的区别在于,这个问题仅限于OOTB,而我的自我回答则保持在该限制范围内。

问题

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

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

我认为这应该是正常的事情,例如:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="PowerShell &quot;$(ThingToDo)&quot;" />
Run Code Online (Sandbox Code Playgroud)

遗憾的是这不起作用:-

  1. 如果ThingToDo解析失败,它会默默地失败
  2. ifThingToDo是不存在的脚本调用,则失败
  3. 如果你想传播一个ERRORLEVEL基于.cmd结果的结果,它会变得很麻烦
  4. 如果你想"在 中嵌入引号ThingToDo,这是行不通的

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

回答

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

<PropertyGroup>
  <__PsInvokeCommand>powershell "Invoke-Command</__PsInvokeCommand>
  <__BlockBegin>-ScriptBlock { $errorActionPreference='Stop';</__BlockBegin>
  <__BlockEnd>; exit $LASTEXITCODE }</__BlockEnd>
  <_PsCmdStart>$(__PsInvokeCommand) $(__BlockBegin)</_PsCmdStart>
  <_PsCmdEnd>$(__BlockEnd)"</_PsCmdEnd>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

然后你需要做的就是:

<Exec 
  IgnoreStandardErrorWarningFormat="true"
  Command="$(_PsCmdStart)$(ThingToDo)$(_PsCmdEnd)" />
Run Code Online (Sandbox Code Playgroud)

它的唯一可取之处(除了捕获我能想到的所有错误类型之外)是它可以与任何 PowerShell 版本和任何 MSBuild 版本一起 OOTB 工作。

我去拿我的外套。