Msbuild ile exec görev çıktısı nasıl alınır


83

Yürütme görevi ile basit çıktı elde etmeye çalışıyorum 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>

Ancak bir sonraki çıktıyı alın:

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

Komut dosyamdan nasıl çıktı alabilirim?



doğru gibi görünüyor, teşekkürler dokümantasyon bilgisini özlüyorum
tbicr

1
İyi bir dokümantasyon genellikle neyin mümkün olmadığı değil, ne olduğu ile ilgilidir. Bunu söyledikten sonra, sorunuz yaygın görünüyor, bu nedenle uygun "topluluk içeriği" eklemeniz ve böylece MSDN belgelerini iyileştirmeniz gerekebilir.
Christian.K

2
Gathering ... ile ilgili gönderideki dosya hackinin yanı sıra, exec bunu exec ile pek iyi yapamıyor gibi görünüyor. Aslında, bazı insanlar msbuildextensions'ta geliştirilmiş bir sürüm istiyor. Exec ile yapmaya çalıştığınız şey nedir? Yapmaya çalıştığınız şeyi başarmanın daha kolay bir yolu olabilir. Örneğin, MSBuild.ExtensionPack.Framework.DateAndTime görevinden datetime değerlerini alabilirsiniz. Bu işlevselliğe gerçekten ihtiyacınız varsa, özel bir msbuild görevi oluşturmanın gidilecek en iyi yol olacağını düşünüyorum. Biraz zamanım olduğunda bir tane kırbaçlamaya ve buraya göndermeye çalışacağım.
Dan Csharpster

stackoverflow.com/questions/11096148/… Bu bağlantı <Message Importance = "high" Text = "$ (Test2)" /> kullanıyor
Cyrus Downey

Yanıtlar:


142

Herkese iyi haberler! Artık <Exec>.NET 4.5'ten itibaren çıktı yakalayabilirsiniz .

Bunun gibi:

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

Basitçe:

  • Ekle ConsoleToMsBuild="true"sizin için <Exec>etiketi
  • ConsoleOutputBir <Output>etiketteki parametreyi kullanarak çıktıyı yakalayın

En sonunda!

Belgeler burada


2
Oops, evet. Şu adrestedir
Avi Cherry

2
Bu, Microsoft Build Tools 2013 tarafından yüklenen MSBuild 12 ile çalışır: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul

1
@AviCherry lütfen dokümantasyon bağlantısını yorumlara değil cevabınıza ekleyebilir misiniz? Bunun TFS Team Build 2012 bağlamında çalışmasını sağlayabildiniz mi?
Ryan Gates

3
Harika bul, @AviCherry! ConsoleToMSBuild ConsoleOutput, Exec görevinin belgelerinde eksiktir ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
savak


7

MSBuild'in sınırlamalarından ve çalışması gereken ancak çalışmayan (en azından her bağlamda değil) şeylerden çok sinirlendiğim noktaya geldim, hemen hemen her zaman MSBuild ile bir şey yapmam gerekiyor. , C # 'da özel bir yapı görevi oluşturuyorum.

Diğer önerilerin hiçbiri işe yaramıyorsa, kesinlikle bu şekilde yapabilirsiniz.


3
Acını hissediyorum - özel görevim bir python betiği olsa da.
NetworkBurger

Anlaşılabilir, ancak MSBuild'in bilgiyi çıktı / hata konsollarına yönlendirmenin daha yapısal bir yolu olduğunu düşünüyorum. Bunun toplu dosyaların bir adım üzerinde olduğunu kesinlikle düşünmeme rağmen
Nate-Wilkins

2
Bunun, bu sorunla karşılaştığınız andan itibaren geçerli olduğunu biliyorum, ancak aynı şeyi yaptım ve <Project> öğesinin kökünde ToolsVersion = "12.0" ayarlayarak sorunu çözdüm .. umarım bu biraz yardımcı olur :)
Paul Carroll

4

Çıktı satırlarının noktalı virgülle ayrıldığı düz bir dizeye değil, dizi benzeri bir yapıya çıktı yakalamak istiyorsanız , PropertyName yerine ÖğeAdı kullanın :

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

1

Çıktıyı tabiri caizse bir dosyaya aktarabilir ve tekrar okuyabilirsiniz.

echo test output > somefile.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.