Windows cmd को एक फ़ाइल में stdout और stderr पर पुनर्निर्देशित करें


688

मैं एक 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.

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


14
TechNet: कमांड पुनर्निर्देशन ऑपरेटरों का उपयोग करना (इसका उत्तर यहां दिए गए किसी भी उत्तर से बेहतर है)।
मार्टिन प्रिक्रील

1
2> और 1 के रूप में यह एक ही फाइल को फिर से खोल नहीं सकता
ल्यूक

जवाबों:


1090

तुम्हें चाहिए:

dir > a.txt 2>&1

वाक्य-विन्यास (stderr) को (stdout) 2>&1रीडायरेक्ट करेगा । तुम भी के लिए पुनः निर्देशित द्वारा संदेशों को छुपा सकते हैं , अधिक विवरण और MSDN पर उदाहरण21NUL


32
इसके लिए धन्यवाद, पता नहीं था कि यह यूनिक्स शेल सिंटैक्स DOS के लिए भी काम करता है!
चंडिवर

20
यह सभी आउटपुट को छिपाने के लिए बहुत अच्छा है .. net stop w3svc >NUL 2>&1.. धन्यवाद!
थाचवॉडर

3
@wasatchwizard Ithink से मुझे परेशानी हुई, लेकिन> NUL 2> NUL ने ठीक काम किया
FrinkTheBrave

13
यदि कोई हैंडल है, तो हैंडल (यानी 2) और रीडायरेक्ट ऑपरेटर (यानी>) के बीच कोई स्थान नहीं हो सकता है। इसलिए 2> 2.txtकाम करता है (या 2> &1) 2 > 2.txtनहीं करता है; 2 > &1नहीं करता।
लाल मटर

9
मुझे SO बहुत पसंद है। "उघ, यह एक छोटी सी समस्या एक घंटे की तरह लेने जा रही है"। इस उत्तर को खोजने में मुझे यह टिप्पणी लिखने में अधिक समय लगा।
ब्रैंडन

195

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

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

10
बाद में मुझे यह पता करने में घंटों का समय लगा कि क्या गलत है डेलबॉयज! धन्यवाद!
नाम जी VU

4
क्या यह कहीं भी समझाया गया है कि क्यों 1> से पहले 2> और 1 डालने से इच्छित प्रभाव प्राप्त नहीं होगा? मुझे दृढ़ता से संदेह है कि यह "cmd" पार्स कमांड के साथ करने के लिए मिला है जो उस क्रम के आधार पर दो अलग-अलग अर्थ देता है जिसमें आप पुनर्निर्देशन निर्दिष्ट करते हैं। लेकिन शब्दार्थ नियम कहीं भी प्रलेखित हैं क्योंकि मुझे लगता है कि यह सीखने लायक कुछ है क्योंकि यह घंटों बर्बाद कर सकता है।
igbgotiz

12
@igbgotiz 2> और 1 का अर्थ है 'धारा 2 अनुप्रेषित धारा 1'। तो आपको धारा 1 को स्थापित करने की आवश्यकता है
FrinkTheBrave

3
@FrinkTheBrave लेकिन धारा 1 मानक आउटपुट (जैसे कंसोल) है यदि स्पष्ट रूप से निर्दिष्ट नहीं है। कि अभी भी यह imho नहीं समझाता है।
12

1
@MDeSepepmeester, यदि आप करते हैं dir 2>&1 > a.txt, तो आप पहली बार अनुप्रेषित ( >) स्ट्रीम 2 (stderr) से स्ट्रीम 1 (stdout) कर रहे हैं। फिर, उन दोनों को पहले से ही एक साथ शामिल होने के बाद, आप >फ़ाइल में stdout ( कोई निर्दिष्ट नहीं) के साथ रीडायरेक्ट कर रहे हैं । यदि आप चाहते हैं कि stderr कहीं और जाए, तो आप इसे पहले stdout के साथ शामिल नहीं कर सकते।
cp.engr

80

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

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

एमएस सपोर्ट केबी 110930 से लिया गया ।


MSKB110930 से

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

सारांश

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

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

उदाहरण

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

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

File Not Found

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

File Not Found

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

dir file.xxx 2> nul

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

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

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

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

29

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

dir >> a.txt 2>&1

9
>>फ़ाइल जहां को संलग्न कर देता है >फ़ाइल अधिलेखित कर देता है।
डेलिआटगट

13

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

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

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

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


2

हालाँकि, इस बात की कोई गारंटी नहीं है कि रीडायरेक्ट मर्ज सिंटैक्स का उपयोग करके समय के क्रम में लाइन-बाय-लाइन का उत्पादन SDTOUTऔर STDERRइंटरव्यू किया POSIXजाता है।

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

एक समर्पित सांत्वना उत्पादन लकड़हारा (Ie "StdOut/StdErr Logger"द्वारा'LoRd MuldeR' तरह के कार्य के लिए ) अधिक विश्वसनीय हो सकता है।

देखें: मुल्देआर का ओपनसोर्स प्रोजेक्ट


0

एक बैच फ़ाइल (विंडोज 7 और ऊपर) में मुझे यह तरीका सबसे विश्वसनीय लगा

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

जाहिर है, जो कुछ भी आप चाहते हैं उसका उपयोग करें और आउटपुट को पाठ फ़ाइल में निर्देशित किया जाएगा। इस विधि का उपयोग करना विश्वसनीय है स्क्रीन पर कोई आउटपुट नहीं है।


(मूल रूप से एक ही उत्तर कुछ साल पहले दिया गया था।) आप >con echo This goes to screenउपयोगकर्ता इनपुट के लिए भी उपयोगी के साथ स्क्रीन पर आउटपुट के लिए मजबूर कर सकते हैं >con set /p "var="Input: "नोट: वे लाइनें केवल स्क्रीन पर दिखाई देंगी और फ़ाइल पर पुनर्निर्देशित नहीं होंगी।
स्टीफन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.