重定向但也显示进程输出流

时间:2011-09-09 21:31:45

标签: c# redirect process stdout

我正在运行构建,我希望能够在发生这种情况时查看进度。但是如果构建有错误,我还想保存输出。

我知道我可以使用Process.UseShellExecute = falseRedirectStandardOutput,但这只是故事的一部分。

我该怎么做?

3 个答案:

答案 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上的另一个答案是答案或评论