如何使用msbuild获取exec任务输出


82

我正在尝试通过exec任务获取简单的输出msbuild

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Test">
    <Exec Command="echo test output">
      <Output TaskParameter="Outputs" ItemName="Test1" />
    </Exec>
    <Exec Command="echo test output">
      <Output TaskParameter="Outputs" PropertyName="Test2" />
    </Exec>
    <Message Text="----------------------------------------"/>
    <Message Text="@(Test1)"/>
    <Message Text="----------------------------------------"/>
    <Message Text="$(Test2)"/>
    <Message Text="----------------------------------------"/>
  </Target>
</Project>

但是得到下一个输出:

  echo test output
  test output
  echo test output
  test output
  ----------------------------------------
  ----------------------------------------
  ----------------------------------------

如何通过脚本获取输出?



似乎是对的,谢谢我,我想念文档信息
tbicr

1
好文档通常不是关于不可能的事,而是关于什么是可能的。话虽如此,您的问题似乎很普遍,因此也许您应该添加适当的“社区内容”,从而改善MSDN文档。
Christian.K

2
除了Gathering ...相关文章中的文件黑客攻击外,exec似乎对exec不能做得很好。实际上,有些人正在要求msbuildextensions中的改进版本。您想对exec执行什么操作?可能有更简单的方法来完成您要尝试的任何事情。例如,您可以从MSBuild.ExtensionPack.Framework.DateAndTime任务获取日期时间值。如果您确实需要此功能,我认为构建自定义msbuild任务将是最佳途径。有空的时候我会鞭打一个,然后贴在这里。
Dan Csharpster 2012年

stackoverflow.com/questions/11096148/…此链接使用<Message Importance =“ high” Text =“ $(Test2)” />
Cyrus Downey 2012年

Answers:


141

大家好消息!现在,您可以从<Exec>.NET 4.5开始捕获输出。

像这样:

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" PropertyName="OutputOfExec" />
</Exec>

只是:

  • 添加ConsoleToMsBuild="true"<Exec>标签
  • 使用标签中的ConsoleOutput参数捕获输出<Output>

最后!

这里的文件



2
这可与由Microsoft Build Tools 2013安装的MSBuild 12一起使用:microsoft.com/en-us/download/details.aspx?
id

1
@AviCherry您能否在答案中而不是评论中包含指向文档的链接?您是否能够在TFS Team Build 2012的背景下使用它?
瑞恩·盖茨

3
很棒的发现,@ AviCherry!Exec任务本身的文档(msdn.microsoft.com/zh-cn/library/x8zx72cd.aspx)中缺少ConsoleToMSBuild ConsoleOutput的监督。


7

我已经到了让我对MSBuild的局限感到沮丧的地步,这些东西本来可以工作但不能(至少不是在每种情况下都可以),在几乎任何时候我都需要对MSBuild做任何事情,我在C#中创建了一个自定义生成任务。

如果没有其他建议可行,那么您当然可以这样做。


3
我感到您很痛苦-尽管我的自定义任务是python脚本。
NetworkBurger 2014年

可以理解,但我认为MSBuild更是一种结构化的方式,可将信息通过管道传递到输出/错误控制台。尽管我绝对觉得这比批处理文件高出了一步
Nate-Wilkins

2
我知道这与您遇到此问题的时间完全不同,但是我只是发生了同样的事情,并通过在根<Project>元素中设置ToolsVersion =“ 12.0”来解决了该问题。希望这对您有所帮助:)
保罗·卡罗尔

4

如果要将输出捕获为类似数组的结构,而不是捕获为输出字符串用分号分隔的纯字符串,请使用ItemName而不是PropertyName

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" />
</Exec>

1

您可以将输出通过管道传输到文件中,然后再读回。

echo test output > somefile.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.