एक फ़ाइल के लिए Windows cmd में कमांड आउटपुट लिखना (एक मोड़ के साथ)


9

इसलिए मैं चलाने की कोशिश कर रहा हूं foo.exe, लेकिन मैं आउटपुट को टर्मिनल में नहीं बल्कि एक फाइल में चाहता हूं। रनिंग foo.exe > foo.txtमेरे लिए यह पूरा करना चाहिए, लेकिन यह नहीं है। जब मैं एक्स-फ़ाइल चला रहा हूं, तो मुझे आउटपुट मिलता है। निर्वासन दूसरे शब्दों में ठीक काम कर रहा है। हालाँकि, जब मैं आउटपुट को किसी फ़ाइल में भेजने की कोशिश करता हूं, तो मुझे केवल यही मिलता है:

'c:/Program' is not recognized as an internal or external command,
operable program or batch file.

यह केवल तब दिखाई देता है जब मैं इसे किसी फ़ाइल में भेजने का प्रयास करता हूं। यह सोचकर कि यह पथ हो सकता है (जो कि c:\Program Files (x86)\और इसी तरह है) जिसका गलत अर्थ है, मैंने आउटपुट फाइल को इस तरह निर्दिष्ट करने की कोशिश की: foo.exe > c:\test.txtलेकिन फिर भी कोई खुशी नहीं हुई।

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


यदि आप प्रोग्राम को एक साधारण निर्देशिका (C: \ Simple या सम C: \) में ले जाते हैं और वहां से इन चीजों को आज़माते हैं तो क्या होता है?
जनवरी डॉगजेन

जवाबों:


22

आपने वह कमांड नहीं दिखाया है जिसका आप उपयोग कर रहे हैं जो विफल हो रहा है। यदि आप इसे अपने प्रश्न में दर्शाते हैं, तो आपके लिए इसका समाधान खोजना आसान हो सकता है।

मुझे उम्मीद है कि आपका आदेश कुछ इस तरह है:

C:\>foo.exe|c:\Program Files (x86)\something\test.txt

आप जो त्रुटि प्राप्त कर रहे हैं, वह कुछ हद तक एक सुराग है:

'c:/Program' is not recognized as an internal or external command, operable program or batch file.

प्रथम:
... is not recognized as an internal or external command, operable program or batch file.

यह आमतौर पर तब होता है जब आप किसी फ़ाइल का उपयोग करने के |बजाय अनुप्रेषित करने का प्रयास करते हैं >

दूसरा:
'c:/Program' ...

स्पेसल वाले फ़ाइलनाम (या पथ) को निर्दिष्ट करते समय, आपको इसे दोहरे-उद्धरण चिह्नों ( "...") में घेरना चाहिए । ऐसा इसलिए है क्योंकि जब OS फ़ाइल को पुनर्निर्देशित करने के लिए निर्धारित कर रहा है, तो यह फ़ाइल नाम की तलाश में बंद हो जाएगा जब यह एक अनछुए स्थान का सामना करता है "c:/Program":।

इसे इस्तेमाल करे:

foo.exe>"c:\Program Files (x86)\something\test.txt"



यदि उपरोक्त foo.exeपाठ फ़ाइल से आउटपुट कैप्चर करने के लिए काम नहीं करता है , तो एक और संभावना है ...

यदि प्रोग्राम foo.exeइसके STDERRबजाय अपने आउटपुट को लिख रहा है STDOUT, तो foo.exeएकल के साथ सरल पुनर्निर्देशन का उपयोग करके आउटपुट को कैप्चर नहीं किया जाएगा >। आपको इसे इस तरह करना होगा:

foo.exe>"c:\Program Files (x86)\something\test.txt" 2>&1



संपादित करें:

यहाँ फ़ाइल पुनर्निर्देशन और 2>&1संकेतन की व्याख्या है।

जब कोई प्रोग्राम टर्मिनल को लिखता है, तो वह दो में से एक को लिख सकता है Streams

  1. स्ट्रीम 1 को मानकSTDOUT या आउटपुट के रूप में संदर्भित किया जाता है । आमतौर पर, प्रोग्राम धारा 1 के लिए अपना "सामान्य" आउटपुट लिखते हैं ।

  2. स्ट्रीम 2 को मानकSTDERR या त्रुटि के रूप में संदर्भित किया जाता है । आमतौर पर, प्रोग्राम 2 स्ट्रीम करने के लिए अपने "त्रुटि" आउटपुट (त्रुटि और चेतावनी संदेश) लिखते हैं ।

क्या कोई प्रोग्राम किसी विशेष आउटपुट को लिखता है STDOUTया STDERRप्रोग्रामर द्वारा निर्धारित किया जाता है और उन्होंने प्रोग्राम कैसे लिखा है। कुछ प्रोग्राम सभी आउटपुट (सामान्य आउटपुट और त्रुटियों) को भेजने के लिए लिखे जाते हैं STDOUT

जब कोई प्रोग्राम बिना आउटपुट पुनर्निर्देशन के साथ चलाया जाता है, तो सभी सामान्य और त्रुटि आउटपुट को STDOUTआउटपुट या STDERRआउटपुट के बीच किसी भी भेद के बिना टर्मिनल स्क्रीन पर भेजा जाता है ।

जब आप >इस तरह से एक के साथ "सामान्य" पुनर्निर्देशन करते हैं :

foo.exe > "c:\Program Files (x86)\something\test.txt"

आप निर्दिष्ट नहीं कर रहे हैं कि कौन सी स्ट्रीम को फ़ाइल पर रीडायरेक्ट किया जा रहा है, इसलिए स्ट्रीम 1 को मान लिया गया है।

यह वैसा ही है जैसे कि आपने इसे इस तरह टाइप किया हो:

foo.exe 1> "c:\Program Files (x86)\something\test.txt"

यह निर्दिष्ट फ़ाइल नाम के cmd.exeलिए STDOUT(स्ट्रीम 1) प्रोग्राम आउटपुट को कैप्चर करने के लिए कमांड दुभाषिया ( ) को बताता है । 1में 1>धारा 1 को दर्शाता है।

इस मामले में सभी सामान्य प्रोग्राम को फ़ाइल में कैप्चर किया जाता है, लेकिन यदि प्रोग्राम STDERR(स्ट्रीम 2) को लिखता है , तो उस आउटपुट को कैप्चर नहीं किया जाएगा और स्क्रीन पर दिखाया जाएगा। यह आम तौर पर ऐसा करने का "वांछित" तरीका है ताकि जब आप सामान्य प्रोग्राम आउटपुट कैप्चर कर रहे हों, तो आप स्क्रीन पर देख सकते हैं कि क्या कोई त्रुटि होती है।

यदि आप "सामान्य" आउटपुट को एक फ़ाइल में कैप्चर करना चाहते हैं, और "एरर" आउटपुट को किसी अन्य फ़ाइल में आप इस तरह से कर सकते हैं:

    foo.exe > "c:\output.txt" 2> "C:\error.txt"
or
    foo.exe 1> "c:\output.txt" 2> "C:\error.txt"

यदि आप "सामान्य" आउटपुट और "एरर" आउटपुट को एक ही फाइल पर कैप्चर करना चाहते हैं, तो आप इसे इस तरह निर्दिष्ट कर सकते हैं:

foo.exe > "c:\output.txt" 2>&1

यह मूल रूप से इसे निर्दिष्ट करने का एक "शॉर्टहैंड" तरीका है और इसका अर्थ है स्ट्रीम 1 को निर्दिष्ट फ़ाइल पर पुनर्निर्देशित करना, और स्ट्रीम 1 के रूप में स्ट्रीम 2 को उसी "स्थान" (फ़ाइल) पर पुनर्निर्देशित करना भी है ।


संपादित करें:

पेसियर ने पूछा:

क्या foo.exe> ​​"c: \ output.txt" 2> & 1 और foo.exe> ​​"c: \ output.txt" 2> "c: \ output.txt" में कोई अंतर है? क्या वे समान हैं?

संक्षिप्त उत्तर: आपको लगता है कि वे समान हैं, लेकिन नहीं। वे भिन्न हैं।

रीडायरेक्शन के उपयोग >"filename.ext"से 1>"filename.ext", या 2>"filename.ext", >आउटपुट को एक नई फ़ाइल में लिखे जाने का कारण बनता है, जिसे "filename.ext" नाम दिया गया है। यदि फ़ाइल "filename.ext" पहले से मौजूद है, तो इसे पहले हटा दिया जाएगा।

तो, का उपयोग कर:

foo.exe> ​​"c: \ output.txt" 2> "c: \ output.txt"

एक "संघर्ष" का कारण बनता है जहां दोनों पुनर्निर्देशन एक ही फ़ाइल में लिखने की कोशिश कर रहे हैं और दोनों फ़ाइल को हटाने की कोशिश कर रहे हैं यदि यह पहले से मौजूद है। यह अवांछित व्यवहार का कारण होगा। आम तौर पर, एक या दूसरे, या दोनों, आउटपुट पूरी तरह से या अनुमानित रूप से कैप्चर नहीं किए जाएंगे।

वास्तविक परिणाम ऑपरेटिंग सिस्टम और संस्करण पर निर्भर करेगा, और निष्पादित होने वाली कमांड पर भी निर्भर हो सकता है। क्या होगा संभावना:

1 रीडायरेक्ट में से किसी एक पर भेजे गए आउटपुट को कैप्चर या आंशिक रूप से कैप्चर किया जाएगा, और अन्य रीडायरेक्शन को भेजे गए आउटपुट खो जाएंगे। 2 ऑपरेटिंग सिस्टम कमांड के बारे में शिकायत करेगा और न तो आउटपुट को कैप्चर किया जाएगा (पूरी तरह से)। 3 अनिर्धारित, अवांछनीय, अप्रत्याशित, अप्रत्याशित व्यवहार।

विंडोज 7 पर और संभवतः विंडोज विस्टा / 8/10 पर, और संभवतः विंडोज एक्सपी पर, ऑपरेटिंग सिस्टम कमांड के बारे में शिकायत करेगा और कमांड रद्द कर दिया जाएगा।

उदाहरण के लिए (विंडोज 7): मेरे पास एक फ़ोल्डर है जिसका नाम: "C:\Temp\emptyfolder"और "nonexistantfile" नाम की एक फ़ाइल वहां मौजूद नहीं है।

C:\>cd "\Temp\emptyfolder"

C:\Temp\emptyfolder>dir nonexistantfile>output.txt
File Not Found

C:\Temp\emptyfolder>type output.txt
 Volume in drive F is FFFFx1tb
 Volume Serial Number is 4011-A5C6

 Directory of C:\Temp\emptyfolder

C:\Temp\emptyfolder>

इस मामले में, एक पुनर्निर्देशन ( >output.txt) का उपयोग करके , dirकमांड का आउटपुट फ़ाइल पर कब्जा कर लिया जाता है: output.txtऔर त्रुटि संदेश File Not Foundस्क्रीन पर दिखाया जाता है ... यह अपेक्षित व्यवहार है।

अब, दोनों पुनर्निर्देशन ("> फ़ाइल" और "2> फ़ाइल") का उपयोग कर:

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>output.txt
The process cannot access the file because it is being used by another process.
C:\Temp\emptyfolder>type output.txt

C:\Temp\emptyfolder>

इस मामले में, ऑपरेटिंग सिस्टम ने शिकायत की कि (आउटआउट) फ़ाइल पहले से ही उपयोग में है। और फ़ाइल "output.txt" खाली (0 बाइट्स) समाप्त होती है, और दोनों पुनर्निर्देशन के लिए आउटपुट खो गया था।

अब, अंत में, दोनों पुनर्निर्देशन ("> फ़ाइल" और "2> और 1") का उपयोग कर:

C:\Temp\emptyfolder>dir nonexistantfile>output.txt 2>&1

C:\Temp\emptyfolder>type output.txt
 Volume in drive C is CCCCCCCC
 Volume Serial Number is 1234-ABCD

 Directory of C:\Temp\emptyfolder

File Not Found

C:\Temp\emptyfolder>

इस स्थिति में, "> फ़ाइल" फ़ाइल को कैप्चर करने के लिए "स्ट्रीम 1" ("मानक आउटपुट") के लिए आउटपुट का कारण बनता है। और "2> और 1" पहले से पुनर्निर्देशित "स्ट्रीम 1" के माध्यम से भेजे जाने के लिए "स्ट्रीम 2" ("त्रुटि आउटपुट") के लिए आउटपुट का कारण बनता है, और (उसी) फ़ाइल पर भी कब्जा कर लिया जा सकता है।

यह भी ध्यान देने योग्य है कि आदेश महत्वपूर्ण है। इस तरह आदेश को उलट देना:

dir nonexistant 2>&1 >output.txt

समान नहीं है और संभवतः आपको वांछित परिणाम नहीं देगा।

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


यह पता चला कि foo.exe>"c:\test.txt"वास्तव में काम किया था, लेकिन यह एक त्रुटि थी कि कार्यक्रम दुर्घटनाग्रस्त हो गया (आउटपुट अभी भी वहाँ था)। हालाँकि, आपके सुझाव ने इसे और बेहतर 2>&1बना दिया क्योंकि दुर्घटना की शिकायत दूर हो गई। यह क्या करता है के बारे में विस्तार से देखभाल? एक महान जवाब के लिए फिर से धन्यवाद।
pzkpfw

@ bigbadonk420 - के उपयोग के बारे में जानकारी शामिल करने के लिए मैंने अपना उत्तर अपडेट किया 2>&1। यदि आप अपनी फ़ाइल "c: \ test.txt" की जांच करते हैं, तो आप सबसे अधिक संभावना देखेंगे कि "क्रैश शिकायत" फ़ाइल में लिखी गई थी। 2>&1प्रोग्राम को क्रैश होने से रोकना या रोकना नहीं चाहिए, यह सिर्फ त्रुटि संदेशों को प्रदर्शित करने के बजाय कैप्चर करने का कारण बनता है।
केविन फेगन

1
खैर, किसी कारण के लिए यह करता है।
pzkpfw

1
@ bigbadonk420 - 'for some reason it does'यह किस तरह से पुनर्निर्देशन से प्रभावित है? क्या आप कह रहे हैं कि जब आप पुनर्निर्देशित करते हैं 2>&1, जिसमें त्रुटि नहीं होती है? त्रुटि होने पर आप कौन सा त्रुटि संदेश देख रहे हैं?
केविन फेगन

1
जब 2>&1शामिल नहीं किया जाता है, तो प्रोग्राम क्रैश हो जाता है और मुझे मानक विंडोज मिलता है "इस प्रोग्राम ने डायलॉग" जवाब देना बंद कर दिया है। जब मैं इसे शामिल करता हूं, तो यह नहीं होता है। पता नहीं क्यों। आउटपुट दोनों मामलों में उत्पन्न होता है।
pzkpfw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.