Як отримати вивід завдання exec за допомогою msbuild


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
  ----------------------------------------
  ----------------------------------------
  ----------------------------------------

Як я можу отримати вихід за своїм сценарієм?


1
можливий дублікат результатів збору з виконання програми MSBuild
Christian.K

здається правдою, дякую, мені не вистачає інформації про документацію
tbicr

1
Ну документація, як правило, не стосується того, що неможливо, а що є. З огляду на це, ваше запитання здається загальним, тож, можливо, вам слід додати відповідний "вміст спільноти" і, таким чином, покращити документацію MSDN.
Крістіан.

2
крім хак-файлу у збірці "Збір ...", схоже, exec може це зробити дуже добре з exec. Насправді, деякі люди просять покращеної версії в msbuildextensions. Що ви намагаєтесь зробити з exec? Може бути простіший спосіб досягти того, що ви намагаєтесь. Наприклад, ви можете отримати значення дати та часу із завдання MSBuild.ExtensionPack.Framework.DateAndTime. Якщо вам дійсно потрібна ця функціональність, я думаю, що найкращим шляхом буде побудова власного завдання msbuild. Я спробую підбити одного, коли у мене буде трохи часу, і розмістити його тут.
Dan Csharpster

stackoverflow.com/questions/11096148/… Це посилання використовує <Message Importance = "high" Text = "$ (Test2)" />
Сайрус Дауні,

Відповіді:


142

Всім гарних новин! Тепер ви можете отримувати вихідні дані з <Exec>.NET 4.5.

Подобається це:

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

Просто:

  • Додайте ConsoleToMsBuild="true"до свого <Exec>тегу
  • Захоплення вихідних даних, використовуючи ConsoleOutputпараметр у <Output>тегу

Нарешті!

Документація тут



2
Це працює з MSBuild 12, який інстальовано Microsoft Build Tools 2013: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul

1
@AviCherry, чи можете ви включити посилання на документацію у свою відповідь, а не в коментарі? Чи змогли ви змусити це працювати в контексті TFS Team Build 2012?
Ryan Gates

3
Чудова знахідка, @AviCherry! Який недогляд, що ConsoleToMSBuild ConsoleOutput відсутній у документації до самого завдання Exec ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
weir

1
Зараз це задокументовано тут: docs.microsoft.com/en-us/visualstudio/msbuild/exec-task
Райф Атеф

7

Я дійшов до того моменту, коли мене так розчарували обмеження MSBuild і речі, які повинні працювати, але не працюють (принаймні, не в кожному контексті), що майже в будь-який час мені потрібно щось робити з MSBuild , Я створюю власне завдання збірки в C #.

Якщо жодна з інших пропозицій не працює, ви, звичайно, можете зробити це таким чином.


3
Я відчуваю твій біль - хоча моє власне завдання - це скрипт на пітоні.
NetworkBurger

Зрозуміло, але я думаю, що MSBuild - це більше структурований спосіб передачі інформації на консолі виводу / помилки. Хоча я точно відчуваю, що це на крок вище пакетних файлів
Nate-Wilkins

2
Я знаю, що це сталося з того моменту, коли у вас виникла ця проблема, але у мене просто трапилось те саме, і я вирішив це, встановивши ToolsVersion = "12.0" у кореневому елементі <Project> .. сподіваюся, це допоможе :)
Пол Керролл,

4

Якщо ви хочете отримати вихід у масивноподібну структуру, а не у звичайний рядок, де вихідні рядки розділені крапкою з комою, використовуйте ItemName замість PropertyName :

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

1

Ви можете направити вихід у файл, так би мовити, і прочитати його назад.

echo test output > somefile.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.