Как получить вывод задачи 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
  ----------------------------------------
  ----------------------------------------
  ----------------------------------------

Как я могу получить вывод моего скрипта?

tbicr
источник
кажется правдой, спасибо, я скучаю по документации
tbicr
1
Ну, документация обычно не о том, что невозможно, а о том, что является возможным. С учетом сказанного, ваш вопрос кажется обычным, поэтому, возможно, вам следует добавить соответствующий «контент сообщества» и, таким образом, улучшить документацию MSDN.
Christian.K
2
не считая взлома файлов в посте, связанном с Gathering ..., похоже, что exec может делать это очень хорошо с exec. Фактически, некоторые люди просят улучшить версию в msbuildextensions. Что вы пытаетесь сделать с помощью exec? Может быть более простой способ добиться того, что вы пытаетесь сделать. Например, вы можете получить значения datetime из задачи MSBuild.ExtensionPack.Framework.DateAndTime. Если вам действительно нужна эта функциональность, я думаю, что создание пользовательской задачи msbuild было бы лучшим путем. Я постараюсь придумать один, когда у меня будет время, и выложу его здесь.
Dan Csharpster 05
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
Ой, да. Это по адресу: msdn.microsoft.com/en-us/library/ms124731(v=VS.110).aspx
Avi Cherry
2
Это работает с MSBuild 12, который устанавливается с помощью Microsoft Build Tools 2013: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul
1
@AviCherry, не могли бы вы включить ссылку на документацию в свой ответ, а не в комментарии? Удалось ли вам заставить это работать в контексте TFS Team Build 2012?
Райан Гейтс
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
Я чувствую вашу боль - хотя моя индивидуальная задача - скрипт на Python.
NetworkBurger
Понятно, но я думаю, что MSBuild - это более структурированный способ передачи информации в консоли вывода / ошибок. Хотя я определенно чувствую, что это на шаг выше пакетных файлов,
Нейт-Уилкинс,
2
Я знаю, что это бесполезно с тех пор, как у вас возникла эта проблема, но у меня произошло то же самое, и я решил ее, установив ToolsVersion = "12.0" в корневом элементе <Project> ... надеюсь, это поможет :)
Пол Кэрролл
4

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

<Exec ... ConsoleToMSBuild="true">
  <Output TaskParameter="ConsoleOutput" ItemName="OutputOfExec" />
</Exec>
Франтишек Бачан
источник
1

Вы можете передать вывод в файл, так сказать, и прочитать его.

echo test output > somefile.txt
Шьям
источник