2011-09-09 11 views

答えて

2

更新

グレッグは、以下のコメントで言及したようにも箱から出してコンソールに出力しながら、MSBuildのは、ログファイルに書き出すことができます。

MSBuild [options] /filelogger /fileloggerparameters:LogFile=MSBuildLog.txt 

次のような単純なC#プログラムを試してみてください。リダイレクトされたSTDIN(Console.In)が1つ以上のファイルとSTDOUT(Console.Out)に書き込まれます。私はまだ、コンソールウィンドウに出力ながらディスクにMSBuildのバッチファイルからの出力をリダイレクトするためにそれを使用

using System; 
using System.Collections.Generic; 
using System.IO; 

namespace RedirectToFile 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var buffer = new char[100]; 
      var outputs = new List<TextWriter>(); 

      foreach (var file in args) 
       outputs.Add(new StreamWriter(file)); 

      outputs.Add(Console.Out); 

      int bytesRead; 
      do 
      { 
       bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length); 
       outputs.ForEach(o => o.Write(buffer, 0, bytesRead)); 
      } while (bytesRead == buffer.Length); 

      outputs.ForEach(o => o.Close()); 
     } 
    } 
} 

Usage: MSBuild [options] | RedirectToFile.exe MSBuildLog.txt 
+0

'ReadBlock()'はバッファ全体を常に返す必要はありません。代わりに 'bytesRead> 0'をチェックするべきです。 – svick

+1

+1これはかなりうまくいきます(画面に印刷する方法はややこしいですが)、残念ながらmsbuildの色は失われてしまいます。どのようにそれらを保存するための任意のアイデア? – user420667

+1

上記のプログラムを使用すると、コンソール出力の色を維持する方法がありません。 MSBuildから追加のログを採取したい場合は、「msbuild.exe/logger」オプションを参照してください。http://msdn.microsoft.com/en-us/library/ms171470.aspx – Dennis

1

この答えはあなたにRedirect Standard Output Efficiently in .NET

を助けるべき私は別の答えにリンクかどうかわからない午前PSはSOたぶん、このような答えやコメント

+0

私は正確に何を探していたのかよく分かりません。 – user420667

3

はありますか?

class Tee 
{ 
    private readonly string m_programPath; 
    private readonly string m_logPath; 
    private TextWriter m_writer; 

    public Tee(string programPath, string logPath) 
    { 
     m_programPath = programPath; 
     m_logPath = logPath; 
    } 

    public void Run() 
    { 
     using (m_writer = new StreamWriter(m_logPath)) 
     { 

      var process = 
       new Process 
       { 
        StartInfo = 
         new ProcessStartInfo(m_programPath) 
         { RedirectStandardOutput = true, UseShellExecute = false } 
       }; 

      process.OutputDataReceived += OutputDataReceived; 

      process.Start(); 
      process.BeginOutputReadLine(); 
      process.WaitForExit(); 
     } 
    } 

    private void OutputDataReceived(object sender, DataReceivedEventArgs e) 
    { 
     Console.WriteLine(e.Data); 
     m_writer.WriteLine(e.Data); 
    } 
} 
+0

+1。私はこれがうまくいくと確信していますが、おそらく私が静的なクラスを使用しているので、それを動作させるのに問題がありました。 – user420667

関連する問題