Windows cmd stdout और stderr को एक फ़ाइल में रीडायरेक्ट करें




command-line pipe (6)

मैं एक एकल फ़ाइल में एक DOS कमांड के सभी आउटपुट (stdout + stderr) को रीडायरेक्ट करने का प्रयास कर रहा हूं:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

क्या यह संभव है, या मुझे बस दो अलग-अलग फाइलों पर रीडायरेक्ट करना चाहिए?


हालांकि, इस बात की कोई गारंटी नहीं है कि एसडीटीओयूटी और एसटीडीईआरआर का आउटपुट पीओएसईक्स रीडायरेक्ट विलय सिंटैक्स का उपयोग करके समय-समय पर लाइन-बाय-लाइन इंटरव्यू किया गया है।

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

एक समर्पित कंसोल आउटपुट लॉगर ('LoRd MuldeR' द्वारा "StdOut / StdErr Logger" की तरह) इस तरह के कार्य के लिए अधिक विश्वसनीय हो सकता है। देखें: मुलदेआर की ओपनसोर्स परियोजनाएं


मैंने अभी जवाब को कटा कर दिया है क्योंकि एंड्रॉर्स ने इसे अभी पोस्ट किया है, लेकिन ...

मेरी विंडोज़ सहायता से, मैंने पुनर्निर्देशन की खोज की (यूआरएल ms-its:C:\WINDOWS\Help\ntcmds.chm::/redirection.htm )।

आप >> और | के बारे में पढ़ना चाह सकते हैं (पाइप) भी।


सही है, प्रक्रिया के लिए फ़ाइल हैंडल 1 STDOUT है, जिसे 1> या द्वारा > द्वारा पुनर्निर्देशित किया गया है (1 को छोड़ दिया जा सकता है, कन्वेंशन द्वारा, कमांड दुभाषिया [cmd.exe] इसे संभालने के लिए जानता है)। फ़ाइल हैंडल 2 एसटीडीईआरआर है, 2> द्वारा पुनर्निर्देशित।

ध्यान दें कि यदि आप लॉग फ़ाइलों को बनाने के लिए इनका उपयोग कर रहे हैं, तब तक जब तक आप _uniquely_name_ (जैसे दिनांक-और-समय-मुद्रित) लॉग फ़ाइलों को आउटपुट भेज रहे हों, तब यदि आप दो बार एक ही प्रक्रिया चलाते हैं, तो पुनर्निर्देशित ओवरराइट ( प्रतिस्थापित करें) पिछली लॉग फ़ाइल।

>> (या तो STDOUT या STDERR के लिए) फ़ाइल को स्थानांतरित नहीं करेगा। इसलिए आपको एक संचयी लॉगफाइल मिलता है, जो प्रक्रिया के सभी रनों के परिणाम दिखाता है - आम तौर पर अधिक उपयोगी।

खुश ट्रेल्स...


एमएसकेबी से पृष्ठभूमि की जानकारी

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

एमएस समर्थन केबी 110 9 30 से लिया गया।

एमएसकेबी 110 9 30 से

कमांड प्रॉम्प्ट से त्रुटि संदेशों को पुनर्निर्देशित करना: STDERR / STDOUT

सारांश

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

कंसोल (कमांड प्रॉम्प्ट) एप्लिकेशन या कमांड से आउटपुट अक्सर दो अलग-अलग धाराओं में भेजा जाता है। नियमित आउटपुट मानक आउट (एसटीडीओयूटी) को भेजा जाता है और त्रुटि संदेश मानक त्रुटि (एसटीडीईआरआर) को भेजे जाते हैं। जब आप ">" प्रतीक का उपयोग करके कंसोल आउटपुट को रीडायरेक्ट करते हैं, तो आप केवल STDOUT को रीडायरेक्ट कर रहे हैं। एसटीडीईआरआर को पुनर्निर्देशित करने के लिए आपको पुनर्निर्देशन प्रतीक के लिए '2>' निर्दिष्ट करना होगा। यह दूसरी आउटपुट स्ट्रीम का चयन करता है जो एसटीडीईआरआर है।

उदाहरण

आदेश dir file.xxx (जहां file.xxx मौजूद नहीं है) निम्न आउटपुट प्रदर्शित करेगा:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

यदि आप dir file.xxx > nul का उपयोग करके आउटपुट को NUL डिवाइस पर रीडायरेक्ट करते हैं, तो आप अभी भी आउटपुट के त्रुटि संदेश भाग को देखेंगे, जैसे:

File Not Found

NUL को त्रुटि संदेश (केवल) पुनर्निर्देशित करने के लिए, निम्न आदेश का उपयोग करें:

dir file.xxx 2> nul

या, आप आउटपुट को एक स्थान पर रीडायरेक्ट कर सकते हैं, और त्रुटियों को दूसरे पर रीडायरेक्ट कर सकते हैं।

dir file.xxx > output.msg 2> output.err

आप STDERR से STDOUT के आउटपुट को रीडायरेक्ट करने के लिए "और 1" कमांड का उपयोग करके त्रुटियों और मानक आउटपुट को एक फ़ाइल में प्रिंट कर सकते हैं और फिर आउटपुट को STDOUT से फ़ाइल में भेज सकते हैं:

dir file.xxx 1> output.msg 2>&1

एंडर्स लिंडाहल का जवाब सही है, लेकिन यह ध्यान दिया जाना चाहिए कि यदि आप किसी फ़ाइल में stdout को रीडायरेक्ट कर रहे हैं और साथ ही stderr को रीडायरेक्ट करना चाहते हैं तो आपको यह सुनिश्चित करना होगा कि 2>&1 को 1> रीडायरेक्ट के बाद निर्दिष्ट किया गया हो, अन्यथा यह काम नहीं करेगा।

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt

सही तरीका: dir > a.txt 2>&1 । संलग्न करने के लिए, >> उपयोग करें।


एक स्क्रिप्ट के सामान्य लॉगफाइल में stdout और stderr जोड़ने के लिए:

dir >> a.txt 2>>&1




pipe