2010-09-04 18 views
11

में आउटपुट विंडो पर एक बच्चे की प्रक्रिया के उत्पादन (stdout, stderr) पुन: निर्देशित फिलहाल मैं के साथ मेरी सी # कार्यक्रम से एक बैच फ़ाइल शुरू कर रहा हूँ:दृश्य स्टूडियो

System.Diagnostics.Process.Start(@"DoSomeStuff.bat"); 

क्या मैं होना चाहते हैं करने में सक्षम दृश्य स्टूडियो (विशेष रूप से विजुअल सी # एक्सप्रेस 2008) में आउटपुट विंडो में उस बच्चे की प्रक्रिया के आउटपुट (stdout और stderr) को रीडायरेक्ट किया जाता है।

क्या ऐसा करने का कोई तरीका है?

(इसके अतिरिक्त:। ऐसी है कि यह सब बफ़र नहीं कर रहा है और उसके बाद उत्पादन खिड़की जब बच्चे प्रक्रिया खत्म करने के लिए बाहर थूक)


(Btw: (लेकिन stderr मैं stdout प्राप्त कर सकते हैं इस समय) पैरेंट आउटपुट विंडो में दिखाई देने की प्रक्रिया, मेरे प्रोग्राम को "कंसोल एप्लिकेशन" के बजाय "विंडोज़ एप्लिकेशन" बनाकर। यह तोड़ता है यदि प्रोग्राम विजुअल स्टूडियो के बाहर चलाया जाता है, लेकिन यह मेरे विशेष मामले में ठीक है ।)

+0

सभी टुकड़े यहां हैं। प्रक्रिया के लिए आउटपुट रीडायरेक्ट करें, आउटपुट विंडो में इसे प्राप्त करने के लिए ट्रेस का उपयोग करें। –

+0

क्या आपने यह पता लगाया है कि बाल प्रक्रिया के आउटपुट को रीडायरेक्ट कैसे करें? नीचे दिए गए उत्तरों माता-पिता की प्रक्रिया के आउटपुट को रीडायरेक्ट कर सकते हैं लेकिन बच्चे को नहीं। – Fiona

उत्तर

20
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.OutputDataReceived += (sender, args) => Console.WriteLine(args.Data); 
process.Start(); 
process.BeginOutputReadLine(); 

process.WaitForExit(); 

एक ही विचार है, सिर्फ उन विधि/संपत्ति के नाम में Output बदलें।

+6

यह उत्तर ज्यादातर सही है। इसमें कुछ सामान गुम है। विशेष रूप से: 'प्रारंभ करें ... रीडलाइन' और 'WaitForExit' के बाद' प्रारंभ करें 'कॉल करें। बैच फ़ाइल में एक वैध stdin की इच्छा रखने वाले कार्यक्रमों में से किसी एक प्रोग्राम (विशेष रूप से प्लिंक) के कारण किसी समस्या को ठीक करने के लिए 'RedirectStandardInput' को सेट करना, भले ही उसने इसका उपयोग नहीं किया हो। –

+0

'WaitForExit() 'एक अनंत प्रतीक्षा कर सकता है। हमेशा एक टाइमआउट के साथ विधि को कॉल करें: 'process.WaitForExit (10000) '=> 10 सेकंड प्रतीक्षा करता है। –

-3

क्या आपने DefaultTraceListener का उपयोग करने पर विचार किया है?

//Create and add a new default trace listener. 
    DefaultTraceListener defaultListener; 
    defaultListener = new DefaultTraceListener(); 
    Trace.Listeners.Add(defaultListener); 
+2

यह मेरे प्रश्न का उत्तर * दूरस्थ रूप से * दूरस्थ रूप से भी नहीं करता है। और लिंक किए गए एमएसडीएन पेज से: "इस वर्ग का एक उदाहरण स्वचालित रूप से डीबग में शामिल हो जाता है। लिस्टेनर्स और ट्रेस। लिस्टेनर्स संग्रह। स्पष्ट रूप से एक दूसरा डिफॉल्टट्रेस लिस्टनर जोड़ना डीबगर आउटपुट विंडो में डुप्लिकेट संदेश और आवेषण के लिए डुप्लिकेट संदेश बॉक्स का कारण बनता है।" आपका जवाब पूरी तरह से बेकार से भी बदतर है। –

+4

बदला डाउनवोट, आह? उत्तम दर्जे का रहो, जेनरिक 35। –

+0

+1 एंडर के एमएसडीएन पेज स्पष्टीकरण – prabhakaran

2

यहां क्या हो रहा है कि विजुअल स्टूडियो आउटपुट विंडो में प्रोग्राम से डीबग आउटपुट प्रदर्शित कर रहा है। यही है: यदि आप Trace.WriteLine का उपयोग करते हैं, तो यह डिफ़ॉल्ट ट्रेस श्रोता के कारण आउटपुट विंडो में दिखाई देगा।

किसी भी तरह, आपके विंडोज़ फॉर्म एप्लिकेशन (जब यह कंसोल। राइटलाइन का उपयोग करता है; मुझे लगता है कि आप कंसोल का उपयोग कर रहे हैं। राइटलाइन) डीबग आउटपुट भी लिख रहा है, और विजुअल स्टूडियो इसे उठा रहा है।

यह बाल प्रक्रियाओं के लिए समान नहीं होगा, जब तक कि आप आउटपुट को स्पष्ट रूप से कैप्चर नहीं करते और इसे अपने आउटपुट के साथ रीडायरेक्ट नहीं करते। Error के लिए

+0

मूल रूप से मैं क्या पूछने की कोशिश कर रहा हूं - आप आखिरी बिट कैसे करते हैं? (और, मुझे एहसास हुआ कि मैं इसे अपने प्रश्न से याद कर रहा था: यह कैसे होता है "ऐसा होता है"?) –

8

मेरे लिए इस काम का एक बदलाव - अब इसे पोस्ट करना क्योंकि मेरी इच्छा है कि मैं इसे पहले पाउंगा। ध्यान दें कि यह वास्तविक कोड से निकाला गया एक टुकड़ा है इसलिए छोटी त्रुटियां हो सकती हैं।

तकनीक कुछ एमएसडीएन कोड पर आधारित है। मैं यह समझने में सक्षम नहीं हूं कि "फ्लाई पर" अपडेट करने के लिए आउटपुट विंडो कैसे प्राप्त करें। यह इस कार्य के बाद तक अद्यतन नहीं होता है।

// Set this to your output window Pane 
private EnvDTE.OutputWindowPane _OutputPane = null; 

// Methods to receive standard output and standard error 

private static void StandardOutputReceiver(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    // Receives the child process' standard output 
    if (! string.IsNullOrEmpty(outLine.Data)) { 
     if (_OutputPane != null) 
      _OutputPane.Write(outLine.Data + Environment.NewLine); 
    } 
} 

private static void StandardErrorReceiver(object sendingProcess, DataReceivedEventArgs errLine) 
{ 
    // Receives the child process' standard error 
    if (! string.IsNullOrEmpty(errLine.Data)) { 
     if (_OutputPane != null) 
      _OutputPane.Write("Error> " + errLine.Data + Environment.NewLine); 
    } 
} 

// main code fragment 
{ 
    // Start the new process 
    ProcessStartInfo startInfo = new ProcessStartInfo(PROGRAM.EXE); 
    startInfo.Arguments = COMMANDLINE; 
    startInfo.WorkingDirectory = srcDir; 
    startInfo.UseShellExecute = false; 
    startInfo.RedirectStandardOutput = true; 
    startInfo.RedirectStandardError = true; 
    startInfo.CreateNoWindow = true; 
    Process p = Process.Start(startInfo); 
    p.OutputDataReceived += new DataReceivedEventHandler(StandardOutputReceiver); 
    p.BeginOutputReadLine(); 
    p.ErrorDataReceived += new DataReceivedEventHandler(StandardErrorReceiver); 
    p.BeginErrorReadLine(); 
    bool completed = p.WaitForExit(20000); 
    if (!completed) 
    { 
     // do something here if it didn't finish in 20 seconds 
    } 
    p.Close(); 
} 
+0

यह सही क्रम में stdout और stderror प्राप्त नहीं होगा .. – paulm

+0

@paulm इसका मतलब क्या है कि आपको सही आदेश नहीं मिलेगा? यह कोड stderr को रीडायरेक्ट करने में मेरे लिए काम नहीं कर रहा है (stdout काम कर रहा है)। कोई विचार क्यों? – rboy

+0

मेरे प्रश्न से उत्तर का उपयोग करें - यह सही क्रम में stderr और stdout नहीं मिलेगा, यानी यदि ऐप बाहर निकलता है, गलती करता है, गलती है, तो आप बाहर निकल सकते हैं, बाहर निकल सकते हैं, गलती कर सकते हैं, इत्यादि। – paulm

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