我正在运行构建,我希望能够在发生这种情况时查看进度。但是如果构建有错误,我还想保存输出。
我知道我可以使用Process.UseShellExecute = false
和RedirectStandardOutput
,但这只是故事的一部分。
我该怎么做?
答案 0 :(得分: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);
}
}
答案 1 :(得分:2)
<强>更新强>
正如Greg在下面的评论中提到的那样,MSBuild可以写出日志文件,同时也可以开箱即用输出到控制台。
MSBuild [options] /filelogger /fileloggerparameters:LogFile=MSBuildLog.txt
尝试以下简单的C#程序。它将重定向STDIN(Console.In
)并将其写入一个或多个文件和STDOUT(Console.Out
)。
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());
}
}
}
我使用它将输出从MSBuild批处理文件重定向到磁盘,而仍然输出到控制台窗口。
Usage: MSBuild [options] | RedirectToFile.exe MSBuildLog.txt
答案 2 :(得分:1)
这个答案可以帮助你Redirect Standard Output Efficiently in .NET
PS我永远不确定是否链接到SO上的另一个答案是答案或评论