msbuildでexecタスクの出力を取得する方法


83

私は次のように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 2012年

1
よく文書化することは、通常、不可能なことではなく、何が可能かについてです。そうは言っても、あなたの質問は一般的であるように思われるので、適切な「コミュニティコンテンツ」を追加して、MSDNドキュメントを改善する必要があるかもしれません。
Christian.K

2
Gathering ...関連の投稿でのファイルハックを除けば、execがexecでこれをうまく実行できるようには思えません。実際、msbuildextensionsの改良版を求めている人もいます。execで何をしようとしていますか?あなたが試みていることは何でも達成するためのより簡単な方法があるかもしれません。たとえば、MSBuild.ExtensionPack.Framework.DateAndTimeタスクから日時の値を取得できます。この機能が本当に必要な場合は、カスタムのmsbuildタスクを作成するのが最善の方法だと思います。時間があれば、1つを作ってここに投稿しようと思います。
Dan Csharpster 2012

stackoverflow.com/questions/11096148/…このリンクは<MessageImportance = "high" Text = "$(Test2)" />を使用しています
Cyrus Downey

回答:


142

みなさん、朗報です!.NET4.5以降からの出力をキャプチャできるようになりました<Exec>

このような:

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

単に:

  • 追加ConsoleToMsBuild="true"あなたの<Exec>タグ
  • タグのConsoleOutputパラメータを使用して出力をキャプチャします<Output>

最終的に!

ここにドキュメント


2
おっと、屋。
Avi Cherry

2
これは、Microsoft Build Tools2013によってインストールされるMSBuild12で機能します。microsoft.com/ en
us

1
@AviCherryコメントではなく、回答にドキュメントへのリンクを含めていただけますか?これをTFSTeam Build 2012のコンテキストで機能させることができましたか?
ライアンゲイツ

3
素晴らしい発見、@ AviCherry!ConsoleToMSBuild ConsoleOutputがExecタスク自体のドキュメント(msdn.microsoft.com/en-us/library/x8zx72cd.aspx)から欠落しているという見落としがあります。

1
これは現在ここに文書化されています:docs.microsoft.com/en-us/visualstudio/msbuild/exec-task
Raif Atef

7

私は、MSBuildの制限と、機能するはずなのに機能しないもの(少なくともすべてのコンテキストで)に非常に不満を感じるようになりました。MSBuildで何かをする必要があるときはいつでもそうです。 、C#でカスタムビルドタスクを作成します。

他の提案がどれも機能していない場合は、確かにそのようにすることができます。


3
私はあなたの苦痛を感じます-私のカスタムタスクはPythonスクリプトですが。
networkBurger 2014

理解できますが、MSBuildは、情報を出力/エラーコンソールにパイプするための構造化された方法だと思います。私は間違いなくそれがバッチファイルの上の一歩だと感じていますが
Nate-Wilkins

2
これは、この問題が発生したときから順調に進んでいることはわかっていますが、同じことが起こり、ルートの<Project>要素にToolsVersion = "12.0"を設定することで解決しました。これがお役に立てば幸いです:)
ポールキャロル

4

出力行がセミコロンで区切られているプレーンな文字列ではなく、配列のような構造に出力をキャプチャする場合は、PropertyNameの代わりにItemNameを使用します

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

1

出力をいわばファイルにパイプして、読み戻すことができます。

echo test output > somefile.txt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.