2011-11-03 7 views
7

मैंने Windows कमांड प्रॉम्प्ट में निम्न आदेश चलाने की कोशिश की।विंडोज कमांड प्रॉम्प्ट (cmd.exe) में आउटपुट संदेश को रीडायरेक्ट करने में असमर्थ

abc.exe >log.txt 2>&1 

मैं abc.exe से सभी उत्पादन की उम्मीद कर रहा हूँ log.txt के लिए निर्देशित किया है, लेकिन यह काम नहीं करता है, के रूप में log.txt खाली है।

हालांकि, अगर मैं सिर्फ abc.exe निष्पादित करता हूं, तो आउटपुट विंडोज कमांड प्रॉम्प्ट में दिखाई दे रहा है।

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

+0

'perl abc.exe> ​​log.txt 2> और 1' इस – run

+0

को आजमाएं जब आप कहते हैं कि" यह काम नहीं करता है "तो आपका क्या मतलब है? कार्यक्रम बिल्कुल नहीं चलता है? यह चलता है, लेकिन कोई आउटपुट नहीं है? यह चलता है, लेकिन आउटपुट कंसोल पर जाता है? –

+0

हाय जॉनस्टन, यह फ़ाइल उत्पन्न करता है, लेकिन यह खाली है। आउटपुट कंसोल पर नहीं जाता – TimMe

उत्तर

-1

मैं इस समस्या को देखने के ... पहली बार अपने मानक आउटपुट फाइल करने के लिए लिखते हैं, तो आपके त्रुटि उत्पादन अधिलेखित कर देता है यह - इसलिए यदि आप किसी भी त्रुटि नहीं था, तो आप एक खाली फ़ाइल प्राप्त करें!

इसके बजाय, एक ही फाइल को जोड़कर त्रुटि उत्पादन इस तरह, कोशिश:

abc.exe >log.txt 2>>&1 

+0

-1, यह नहीं है> और करता है। ओपी मूल वाक्यविन्यास सही है, और वास्तव में आपके जैसा ही काम करता है। –

+0

हाँ, अच्छा बिंदु ... मैंने अभी [संदर्भ] देखा है (http://ss64.com/nt/syntax-redirection.html)। मैंने बहुत जल्दी जवाब दिया होगा! – ewall

0

तुम सच में उस संदेश पर कब्जा करने, कंसोल एपीआई का उपयोग की जरूरत है।

CreateConsoleScreenBuffer और SetConsoleActiveScreenBuffer आपको मौजूदा स्क्रीन में हस्तक्षेप से बचने के लिए समर्पित स्क्रीन बफर पर स्विच करने की अनुमति देता है।

SetConsoleScreenBufferSize लाइन रोलओवर से बचने के लिए पर्याप्त बफर को पर्याप्त बना सकता है।

SetConsoleCursorPosition आवश्यकतानुसार कर्सर स्थिति सेट कर सकता है।

प्रोग्राम चलाने के बाद, ReadConsoleOutput आपको कंसोल को जो लिखा है उसे पढ़ने की अनुमति देता है।

फिर आप कंसोल को मूल बफर में वापस करने के लिए GetStdHandle (STD_OUTPUT_HANDLE) और SetConsoleActiveScreenBuffer का उपयोग कर सकते हैं, और अपने अतिरिक्त बफर को बंद करने के लिए CloseHandle का उपयोग कर सकते हैं।

+0

चर्चा लोगों के लिए धन्यवाद।यह पता चला कि जोन्सटन सही है, विक्रेता ने स्वीकार किया कि यह इस कार्यक्रम में एक बग है, जिसके कारण संदेश सही तरीके से रीडायरेक्ट नहीं कर सका। हालांकि, यह मेरे लिए अजीब लगता है कि त्रुटि को विंडोज कंसोल पर मुद्रित किया जा सकता है, लेकिन प्रोग्रामेटिक रूप से इसे कैप्चर करने का कोई तरीका नहीं है। – TimMe

0

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

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