Cách nhận đầu ra nhiệm vụ thực thi với msbuild


82

Tôi đang cố gắng có được đầu ra đơn giản bằng tác vụ thực thi với 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>

Nhưng nhận đầu ra tiếp theo:

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

Làm cách nào để lấy đầu ra bằng tập lệnh của tôi?



có vẻ là đúng, nhờ tôi bỏ lỡ thông tin docuemntation
tbicr

1
Tài liệu tốt thường không nói về những gì không thể, mà là những gì. Như đã nói, câu hỏi của bạn có vẻ là phổ biến, vì vậy có thể bạn nên thêm "nội dung cộng đồng" thích hợp và do đó cải thiện tài liệu MSDN.
Christian.K

2
ngoài vụ hack tập tin trong bài đăng liên quan đến Gathering ..., có vẻ như hành động này không thực hiện tốt với thực thi. Trên thực tế, một số người đang yêu cầu phiên bản cải tiến trong msbuildextensions. Bạn đang cố gắng làm gì với điều hành viên? Có thể có một cách dễ dàng hơn để hoàn thành bất cứ điều gì bạn đang cố gắng. Ví dụ: bạn có thể nhận các giá trị datetime từ tác vụ MSBuild.ExtensionPack.Framework.DateAndTime. Nếu bạn thực sự cần chức năng này, tôi nghĩ rằng việc xây dựng một tác vụ msbuild tùy chỉnh sẽ là cách tốt nhất để thực hiện. Tôi sẽ cố gắng đọc một cái khi tôi có thời gian và đăng nó lên đây.
Dan Csharpster

stackoverflow.com/questions/11096148/… Liên kết này sử dụng <Message Importance = "high" Text = "$ (Test2)" />
Cyrus Downey,

Câu trả lời:


141

Tin vui cho mọi người! Bây giờ bạn có thể ghi lại đầu ra từ <Exec>.NET 4.5.

Như thế này:

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

Đơn giản:

  • Thêm ConsoleToMsBuild="true"vào <Exec>thẻ của bạn
  • Ghi lại kết quả đầu ra bằng cách sử dụng ConsoleOutputtham số trong <Output>thẻ

Cuối cùng!

Tài liệu tại đây



2
Điều này hoạt động với MSBuild 12, được cài đặt bởi Microsoft Build Tools 2013: microsoft.com/en-us/download/details.aspx?id=40760
alexandrul

1
@AviCherry, bạn có thể vui lòng bao gồm liên kết đến tài liệu trong câu trả lời của bạn thay vì trong phần bình luận không? Bạn có thể làm cho điều này hoạt động trong bối cảnh TFS Team Build 2012 không?
Ryan Gates

3
Tìm thấy tuyệt vời, @AviCherry! Thật là một sự giám sát mà ConsoleToMSBuild ConsoleOutput bị thiếu trong tài liệu cho chính tác vụ Exec ( msdn.microsoft.com/en-us/library/x8zx72cd.aspx ).
đập

1
Điều này hiện đã được ghi lại tại đây: docs.microsoft.com/en-us/visualstudio/msbuild/exec-task
Raif Atef

7

Tôi đã đến mức tôi rất thất vọng với những hạn chế của MSBuild và những thứ được cho là hoạt động nhưng không hoạt động (ít nhất là không phải trong mọi ngữ cảnh), đến nỗi tôi cần làm bất cứ điều gì với MSBuild , Tôi tạo một nhiệm vụ xây dựng tùy chỉnh trong C #.

Nếu không có đề xuất nào khác hoạt động, thì bạn chắc chắn có thể làm theo cách đó.


3
Tôi cảm thấy nỗi đau của bạn - mặc dù nhiệm vụ tùy chỉnh của tôi là một tập lệnh python.
NetworkBurger

Có thể hiểu được nhưng tôi nghĩ MSBuild là một cách có cấu trúc hơn để chuyển thông tin vào bảng điều khiển lỗi / đầu ra. Mặc dù tôi chắc chắn cảm thấy rằng đó là một bước trên các tệp hàng loạt
Nate-Wilkins

2
Tôi biết điều này đã xảy ra từ khi bạn gặp sự cố này, nhưng tôi vừa gặp điều tương tự và giải quyết nó bằng cách đặt ToolsVersion = "12.0" trong phần tử <Project> gốc .. hy vọng điều này sẽ giúp được gì đó :)
Paul Carroll

4

Nếu bạn muốn nắm bắt đầu ra cho một cấu trúc giống như mảng chứ không phải một chuỗi thuần túy trong đó các dòng đầu ra được phân tách bằng dấu chấm phẩy, hãy sử dụng ItemName thay vì PropertyName :

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

1

Bạn có thể chuyển đầu ra vào một tệp để nói và đọc lại.

echo test output > somefile.txt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.