2013-07-05 4 views
9

जब मैं कमांड लाइन पर msbuild चलाता हूं तो यह कंसोल में सुंदर रंग दिखाता है।msbuild आउटपुट से रंग कैसे रखे?

हालांकि जब मैं इसे Process.Start के साथ सी # से चलाता हूं, तो आउटपुट काले और सफेद रंग में दिखाई देता है। मैं रंग कैसे रख सकता हूं?

var info = new ProcessStartInfo("msbuild") 
{ 
    UseShellExecute = false, 
    CreateNoWindow = true, 
    RedirectStandardError = true, 
    RedirectStandardOutput = true,    
}; 

using (var p = Process.Start(info)) 
{ 
    p.ErrorDataReceived += (s, e) => Console.Error.WriteLine(e.Data); 
    p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data); 
    p.BeginErrorReadLine(); 
    p.BeginOutputReadLine(); 
    p.WaitForExit(); 
} 
इसके अलावा

हम यहां हैं, जबकि, यह फर्क पड़ता है की तुलना में मैं BeginOutputReadLine से पहले Process.Start चला सकता हूँ? क्या कोई आउटपुट खो जाएगा?


रुचि रखने वालों के लिए प्रेरणा। एक प्रोजेक्ट जो मैं काम करता हूं, एक कस्टम बिल्ड टूल का उपयोग करता है (व्हील इम्हो का पुन: आविष्कार)। यह msbuild का उपयोग करता है लेकिन संकेत के ठोस परतों (उपरोक्त सरलीकृत मॉडल) के पीछे। Msbuild के सहायक रंग खो गए हैं। मैं उन्हें बचाना चाहता हूं।

+0

मुझे लगता है कि आपने एक उपहार खोला है ... हमें यह बताने की देखभाल करें कि इस सवाल के किस पहलू ने हंस पासंत का जवाब पर्याप्त रूप से कवर नहीं किया? या आपने उसे पुरस्कार देने के लिए बाउंटी शुरू कर दी है? –

+1

@ कोडीग्रे हंस कहते हैं कि यह संभव नहीं है। मैं इसे संभव बनाना चाहता हूं। –

+0

दुर्भाग्यवश, वह सही है। 'आउटपुटडेटा प्राप्त' करने का कोई तरीका नहीं है। यह सब आउटपुट पाठ है, रंग नहीं। यदि आप रंग चाहते हैं, तो आपको डेटा को पार्स करना होगा और उन्हें मैन्युअल रूप से लागू करना होगा, जैसा कि वह कहता है। आपको [VSColorOutput] (http://visualstudiogallery.msdn.microsoft.com/f4d9c2b5-d6d7-4543-a7a5-2d7ebabc2496) एक्सटेंशन में रुचि हो सकती है, जो आपके लिए यह करता है। –

उत्तर

7
p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data); 

प्रक्रिया। आउटपुट डेटाटाइसेड पाठ पढ़ता है, रंग नहीं। आउटपुट रीडायरेक्शन फीचर जो कि केवल स्ट्राउड टेक्स्ट को रीडायरेक्ट करता है, कंसोल रंग गुण नहीं। जब आप > कमांड लाइन से आउटपुट को पाठ फ़ाइल में भेजने के लिए एमएसबिल्ड चलाते हैं तो आपको वही चीज़ मिलती है। जब आप नोटपैड में टेक्स्ट फ़ाइल खोलते हैं तो आपको निश्चित रूप से ब्लेंड टेक्स्ट दिखाई देगा।

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

+0

सोचा यह मामला हो सकता है। 'RedirectStandardOutput = false' के साथ क्या होता है? –

+0

स्पष्ट रूप से यदि आप आउटपुट रीडायरेक्ट नहीं करते हैं तो MSBuild फिर कंसोल को लिखता है। और आप कुछ भी नहीं देख पाएंगे क्योंकि आपने इसे कंसोल बनाने के लिए नहीं बताया था। –

1

मुझे यह नहीं पता कि यह विशेष रूप से एमएसबिल्ड के लिए सभी चेतावनियों/त्रुटियों/अन्य रंगों के साथ कैसे कर सकता है, लेकिन आप लिखने से पहले Console.ForegroundColor = ConsoleColor.Red; का उपयोग कर कंसोल रंग बदल सकते हैं, और इसे रीसेट कर सकते हैं Console.ResetColor();

तो आप लिखने से पहले रंग को लाल रंग में बदलने के लिए त्रुटि डेटा को बदल देंगे, और आउटपुट लिखने के बाद रंग को रीसेट कर देंगे।

4

यह बात है, ऐसा करने का कोई और तरीका नहीं है। आपका कोड पहले प्रक्रिया शुरू करता है और फिर ईवेंटशेलर जोड़ता है। तो हो सकता है कि कुछ डेटा खो जाएंगे, लेकिन यह इस बात पर निर्भर करता है कि सीपीयू कोड को कितनी तेज़ी से संसाधित करता है। आपको पहले ईवेंटशेलर को बेहतर तरीके से जोड़ना चाहिए और फिर प्रक्रिया शुरू करना चाहिए। (नीचे देखें)

using (var p = new Process()) 
{ 
    p.StartInfo = new ProcessStartInfo("msbuild") 
    { 
     UseShellExecute = false, 
     CreateNoWindow = true, 
     RedirectStandardError = true, 
     RedirectStandardOutput = true, 
    }; 
    p.ErrorDataReceived += (s, e) => ErrorLine(e.Data); 
    p.OutputDataReceived += (s, e) => OutputLine(e.Data); 
    p.BeginErrorReadLine(); 
    p.BeginOutputReadLine(); 
    p.Start(); 
    p.WaitForExit(); 
} 
void ErrorLine(string text) 
{ 
    Console.ForegroundColor = ConsoleColor.White; 
    Console.BackgroundColor = ConsoleColor.DarkRed; 
    Console.Error.WriteLine(text); 
    Console.ResetColor(); 
} 
void OutputLine(string text) 
{ 
    Console.Error.WriteLine(text); 
}