2011-09-09 17 views
5

Estoy ejecutando una compilación, y me gustaría poder ver el progreso a medida que sucede. Pero también me gustaría guardar el resultado si la compilación tiene un error.Redirigir pero también mostrar el flujo de salida del proceso

Sé que puedo usar Process.UseShellExecute = false y RedirectStandardOutput, pero eso es solo una parte de la historia.

¿Cómo puedo hacer esto?

Respuesta

2

actualización

Como Greg menciones en los comentarios a continuación, MSBuild puede escribir a un archivo de registro a la vez que dar salida a la consola fuera de la caja.

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

intente lo siguiente sencillo programa C#. Tomará el STDIN redirigido (Console.In) y lo escribirá en uno o más archivos y 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()); 
     } 
    } 
} 

lo uso para redirigir la salida de un archivo por lotes de MSBuild en el disco mientras todavía dar salida a la ventana de la consola.

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

'ReadBlock()' no es necesario para devolver siempre el búfer completo. Debería verificar en su lugar 'bytesRead> 0'. – svick

+1

+1 esto funciona bastante bien, (a pesar de ser un tanto espástico acerca de cómo se imprime en la pantalla) pero desafortunadamente los colores de msbuild se pierden. ¿Alguna idea de cómo preservarlos? – user420667

+1

Usando el programa anterior, no hay forma de preservar los colores de salida de la consola. Si desea un registro adicional desde MSBuild, eche un vistazo a la opción 'msbuild.exe/logger', http://msdn.microsoft.com/en-us/library/ms171470.aspx – Dennis

3

Tal como esto?

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. Estoy seguro de que esto funciona, pero tuve problemas para hacerlo funcionar, probablemente porque estoy usando una clase estática. – user420667

Cuestiones relacionadas