2011-09-09 17 views
5

भी प्रदर्शित करता है, मैं एक बिल्ड चला रहा हूं, और प्रगति को ऐसा करने में सक्षम होना चाहूंगा जैसा कि होता है। लेकिन अगर बिल्ड में कोई त्रुटि है तो मैं आउटपुट को भी सहेजना चाहूंगा।रीडायरेक्ट लेकिन प्रक्रिया आउटपुट स्ट्रीम

मुझे पता है कि मैं Process.UseShellExecute = false, और RedirectStandardOutput का उपयोग कर सकता हूं, लेकिन यह कहानी का एकमात्र हिस्सा है।

मैं यह कैसे कर सकता हूं?

उत्तर

2

अद्यतन

ग्रेग के रूप में नीचे टिप्पणी में उल्लेख है, MSBuild एक लॉग फ़ाइल के लिए बाहर लिख सकते हैं जबकि यह भी बॉक्स से बाहर सांत्वना देने outputting।

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

निम्नलिखित सरल सी # कार्यक्रम की कोशिश करो। यह पुनर्निर्देशित 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()); 
     } 
    } 
} 

मैं इसका इस्तेमाल जबकि अभी भी कंसोल विंडो के लिए outputting डिस्क के लिए एक MSBuild बैच फ़ाइल से उत्पादन को अंतरित करें।

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

'रीडब्लॉक()' को हमेशा पूरे बफर को पूर्ण करने की आवश्यकता नहीं है। आपको इसके बजाय 'बाइट्स रीड> 0' की जांच करनी चाहिए। – svick

+1

+1 यह बहुत अच्छी तरह से काम करता है, (यह स्क्रीन पर प्रिंट करने के बारे में कुछ हद तक शानदार है) लेकिन दुर्भाग्यवश एमएसबिल्ड के रंग खो गए हैं। कोई विचार है कि उनको कैसे संरक्षित किया जाए? – user420667

+1

उपर्युक्त प्रोग्राम का उपयोग करके, कंसोल आउटपुट रंगों को संरक्षित करने का कोई तरीका नहीं है। यदि MSBuild से अतिरिक्त लॉगिंग चाहते हैं तो 'msbuild.exe/logger' विकल्प' पर एक नज़र डालें, http://msdn.microsoft.com/en-us/library/ms171470.aspx – Dennis

1

इस जवाब आप Redirect Standard Output Efficiently in .NET

पुनश्च मुझे यकीन है कि अगर एक और जवाब को जोड़ने पर एसओ एक जवाब या एक टिप्पणी

+0

अच्छा लिंक लेकिन यह बिल्कुल दिखाता नहीं है कि मैं वास्तव में क्या देख रहा था। – user420667

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); 
    } 
} 
+0

+1। मुझे यकीन है कि यह काम करता है, लेकिन मुझे इसे काम करने में परेशानी थी, शायद इसलिए कि मैं एक स्थिर वर्ग का उपयोग कर रहा हूं। – user420667

संबंधित मुद्दे