आपने वह कमांड नहीं दिखाया है जिसका आप उपयोग कर रहे हैं जो विफल हो रहा है। यदि आप इसे अपने प्रश्न में दर्शाते हैं, तो आपके लिए इसका समाधान खोजना आसान हो सकता है।
मुझे उम्मीद है कि आपका आदेश कुछ इस तरह है:
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 को मानकSTDOUT या आउटपुट के रूप में संदर्भित किया जाता है । आमतौर पर, प्रोग्राम धारा 1 के लिए अपना "सामान्य" आउटपुट लिखते हैं ।
स्ट्रीम 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"), फिर भी स्क्रीन पर जाएगा (फ़ाइल में नहीं)।