2009-04-24 17 views
5

में प्रदर्शित करें। मैं एक बच्चे की प्रक्रिया को उत्पन्न कर रहा हूं जो एक दृश्य कंसोल विंडो में चलता है (यह एक बैच फ़ाइल है जो MSBuild चलाती है), और मैं आउटपुट उत्पन्न करना चाहता हूं दृश्य कंसोल विंडो में प्रदर्शित प्रक्रिया, साथ ही उस आउटपुट को कैप्चर करें ताकि मैं इसे कोड में संसाधित कर सकूं। मैं कई अन्य प्रश्न और MSDN ProcessStartInfo.RedirectStandardOutput और पसंद के साथ काम कर प्रलेखन पढ़ा है, और मैं पुनः निर्देशित धारा से आउटपुट को कैप्चर और ठीक कोड में इसे संसाधित कर सकते हैं:मानक आउटपुट कैप्चर करें और अभी भी इसे कंसोल विंडो

Process msBuild = new Process(); 
msBuild.StartInfo.FileName = "Build.bat"; 
msBuild.StartInfo.UseShellExecute = false; 
msBuild.StartInfo.RedirectStandardOutput = true; 
msBuild.Start(); 
string output = msBuild.StandardOutput.ReadToEnd(); 
msBuild.WaitForExit(); 

समस्या यह है कि है आउटपुट बाल प्रक्रिया की कंसोल विंडो में प्रदर्शित नहीं होता है; प्रक्रिया चल रही है, लेकिन स्क्रीन खत्म होने पर मुझे बस एक खाली कंसोल विंडो मिलती है, जो समाप्त होने पर गायब हो जाती है।

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

उत्तर

3

एक बार जब आप मानक आउट रीडायरेक्ट कर लेंगे तो यह अब कंसोल पर निर्देशित नहीं होगा। कंसोल को लिखने के लिए आपको इसे मैन्युअल रूप से करना होगा।

यदि आप आउटपुट को निष्पादित करते हैं, तो प्रक्रिया को निष्पादित करना चाहते हैं, अंत में 1 बड़े डंप में, आप प्रक्रिया वर्ग के "आउटपुटडेटा प्राप्त" ईवेंट का उपयोग कर सकते हैं।

+0

वाह - मैं पहले OutputDataReceived नहीं देखा था। साफ! –

+0

ऐसा लगता है कि मेरे पास बाल प्रक्रिया के स्वामित्व वाली कंसोल विंडो में प्रदर्शित आउटपुट हो सकता है या नहीं, और एक ही समय में मूल प्रक्रिया पर रीडायरेक्ट किया जा सकता है। मेरा अगला प्रश्न होगा, क्या आउटपुट को रीडायरेक्ट करना संभव नहीं है, और प्रक्रिया समाप्त होने पर बस इसे कंसोल से कैप्चर करें? या, यदि नहीं, तो कंसोल विंडो मैन्युअल रूप से बनाने का सबसे अच्छा तरीका क्या है ताकि प्रक्रिया को निष्पादित करने के रूप में मैं इसे पुनर्निर्देशित आउटपुट लिख सकूं ('आउटपुटडेटा प्राप्त 'का उपयोग कर? – mjl5007

+1

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx पर एक नज़र डालें। इसमें एक उदाहरण है (आप सभी भाषाओं को बंद करना चाहते हैं लेकिन सी #) –

4

यहाँ मैं क्या उपयोग किया है एक अलग थ्रेड का उपयोग किए बिना, है:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
{ 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.Verb = "open"; 
    proc.StartInfo.FileName = "XXXX"; 
    proc.Start(); 
    String sLine = ""; 
    while ((sLine = proc.StandardOutput.ReadLine()) != null) 
    { 
     System.Console.WriteLine(sLine); 
    } 
    proc.WaitForExit(); //Jon Skeet was here! 
    errorCode = proc.ExitCode; 
    proc.Close(); 
} 
+0

मैं मान रहा था कि ओपी चाहता था कि स्पॉन्गिंग प्रक्रिया चलती रहें - मैंने WaitForExit को कॉल नहीं देखा था। हालांकि मैं आपके लूप के बजाय WaitForExit का उपयोग करूंगा - तंग लूप एक अच्छा विचार नहीं है। –

+0

मैं याद रखने की कोशिश कर रहा हूं कि क्या कोई कारण था कि मैंने WaitForExit का उपयोग नहीं किया था। – crashmstr

+0

मेरे एसवीएन इतिहास को देखते हुए, ऐसा इसलिए था क्योंकि मैं इसे "जबकि (! Proc.HasExited) {/ * यहां पढ़ने वाली सामग्री * /} के रूप में इस्तेमाल करता था, लेकिन उसे सभी पाठ नहीं मिला, और जब मैं स्थानांतरित हुआ यह रीडिंग लूप के बाहर, इसे WaitForExit में बदलने के लिए नहीं सोचा था। – crashmstr

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