私はビルドを実行していますので、進捗状況を確認することができます。しかし、ビルドにエラーがある場合は、出力を保存したいと思います。リダイレクトだけでなく、プロセスの出力ストリームを表示
私はProcess.UseShellExecute = false
とRedirectStandardOutput
を使用できますが、これはその話の一部に過ぎません。
どうすればいいですか?
私はビルドを実行していますので、進捗状況を確認することができます。しかし、ビルドにエラーがある場合は、出力を保存したいと思います。リダイレクトだけでなく、プロセスの出力ストリームを表示
私はProcess.UseShellExecute = false
とRedirectStandardOutput
を使用できますが、これはその話の一部に過ぎません。
どうすればいいですか?
更新
グレッグは、以下のコメントで言及したようにも箱から出してコンソールに出力しながら、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
この答えはあなたにRedirect Standard Output Efficiently in .NET
を助けるべき私は別の答えにリンクかどうかわからない午前PSはSOたぶん、このような答えやコメント
私は正確に何を探していたのかよく分かりません。 – user420667
はありますか?
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);
}
}
+1。私はこれがうまくいくと確信していますが、おそらく私が静的なクラスを使用しているので、それを動作させるのに問題がありました。 – user420667
'ReadBlock()'はバッファ全体を常に返す必要はありません。代わりに 'bytesRead> 0'をチェックするべきです。 – svick
+1これはかなりうまくいきます(画面に印刷する方法はややこしいですが)、残念ながらmsbuildの色は失われてしまいます。どのようにそれらを保存するための任意のアイデア? – user420667
上記のプログラムを使用すると、コンソール出力の色を維持する方法がありません。 MSBuildから追加のログを採取したい場合は、「msbuild.exe/logger」オプションを参照してください。http://msdn.microsoft.com/en-us/library/ms171470.aspx – Dennis