Redirect but also display process output stream

后端 未结 3 1261
-上瘾入骨i
-上瘾入骨i 2020-12-20 23:47

I am running a build, and I would like to be able to view the progress as it happens. But I would also like to save the output if the build has an error.

I know I c

相关标签:
3条回答
  • 2020-12-21 00:10

    Maybe like this?

    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 讨论(0)
  • 2020-12-21 00:26

    this answer should help you Redirect Standard Output Efficiently in .NET

    PS I am never sure if linking to another answer on SO is an answer or a comment

    0 讨论(0)
  • 2020-12-21 00:36

    Update

    As Greg mentions in the comments below, MSBuild can write out to a log file while also outputting to console out of the box.

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

    Try the following simple C# program. It will take the redirected STDIN (Console.In) and write it to one or more files and 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());
            }
        }
    }
    

    I use it to redirect the output from an MSBuild batch file to disk whilst still outputting to the console window.

    Usage: MSBuild [options] | RedirectToFile.exe MSBuildLog.txt
    
    0 讨论(0)
提交回复
热议问题