विंडोज कमांड प्रॉम्प्ट आउटपुट प्रदर्शित करना और इसे एक फ़ाइल पर पुनर्निर्देशित करना


371

मैं विंडोज कमांड प्रॉम्प्ट में कमांड-लाइन एप्लिकेशन को कैसे चला सकता हूं और एक ही समय में एक फ़ाइल में प्रदर्शित और रीडायरेक्ट किए गए दोनों आउटपुट हैं?

यदि, उदाहरण के लिए, मैं कमांड को चलाने वाला था dir > test.txt, तो यह test.txtपरिणाम को प्रदर्शित किए बिना नामक फ़ाइल में आउटपुट को रीडायरेक्ट करेगा ।

मैं यूनिक्स पर कमांड के समान विंडोज कमांड प्रॉम्प्ट में आउटपुट और रीडायरेक्ट आउटपुट को एक फ़ाइल में कैसे प्रदर्शित कर सकता हूं tee?


63
और कृपया इसे MSDOS कहना बंद करें! Cmd.exe और उस braindead command.com के बीच समानता माइनसक्यूल है, और छोटी हो रही है।
paxdiablo


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

1
एक अभी भी कर सकते थे सिर्फ एक फ़ाइल और उपयोग पूंछ (में पाइप stackoverflow.com/questions/187587/... पर उस फ़ाइल)
x29a

क्या होगा अगर मैं एक कमांड लाइन उपयोगिता का उपयोग कर रहा हूं और आउटपुट को फ़ाइल में बिल्कुल उसी प्रारूप में रीडायरेक्ट करना चाहता हूं जैसा कि स्क्रीन पर प्रदर्शित किया गया है मैंने लिंक निकालने के लिए youtube-dl का उपयोग किया है और आउटपुट को txt फ़ाइल में रीडायरेक्ट कर सकता है, लेकिन इसके रूप में स्वरूपित नहीं किया गया है आप प्रॉम्प्ट में, फ़ाइल में सिंगल लाइन के रूप में आएँगे।
बीस्टबॉय

जवाबों:


153

Davor के उत्तर पर विस्तार करने के लिए , आप इस तरह से PowerShell का उपयोग कर सकते हैं:

powershell "dir | tee test.txt"

यदि आप वर्तमान निर्देशिका में एक exe के आउटपुट को पुनर्निर्देशित करने का प्रयास कर रहे हैं, तो आपको .\फ़ाइल नाम पर उपयोग करने की आवश्यकता है , जैसे:

powershell ".\something.exe | tee test.txt"

8
यह सबसे करीबी जवाब है: यह डिफ़ॉल्ट रूप से इंस्टॉल पर काम करता है, क्योंकि पीएस पहले से ही अधिकांश मशीनों पर है और, विशेष रूप से, सर्वर।
स्टोलग

1
यह सबसे अच्छा जवाब है! सरल और काम करता है "आउट ऑफ द बॉक्स"
जोश वर्ट्स

3
इसे पसंद करें :) किसी भी तरह {शक्तियां "पिंग-एन 10 लोकलहोस्ट | टी टेस्ट.टेक्स्ट"} टी पार्टी में चल रहे बेहतर
व्हाट्सएप

4
ध्यान दें कि dirपॉवरशेल में एक उपनाम है, Get-ChildItemजो cmd के आंतरिक dirकमांड की तरह नहीं है । powershell "cmd /c dir | tee test.txt"यदि आप cmd आंतरिक संस्करण चाहते हैं, तो आपको जरूरत है
phuclv

8
सभी आउटपुट को देखने के लिए, STDERR को STDOUT से अनुप्रेषित करना न भूलें 2>&1, उदाहरण के लिएnode 2>&1 | tee debug_log.txt
Zhe Hu

132

मैं आउटपुट का पुनर्निर्देशन या फ़ाइल में रीडायरेक्ट करने और फिर कंसोल पर खोजने में सक्षम था :

dir > a.txt | type a.txt

जहाँ dir वह कमांड है जिसके आउटपुट को रीडायरेक्ट किया जाना है, a.txt एक फाइल है जहाँ आउटपुट को स्टोर करना है।


100
यह उत्तर को संतुष्ट करता है, लेकिन डेटा का उत्पादन होने के बजाय dir कमांड पूरा होने के बाद डेटा को आउटपुट करता है।
लेह रिफ़ेल

10
यह काम करेगा, लेकिन आप अटक जाएंगे यदि कमांड स्टड से इनपुट का इंतजार करता है।
विटिम .us

5
मुझे यह सरल उत्तर पसंद है! मैंने पाया कि एक &एक के बजाय |कुछ आदेश के उत्पादन के लिए आवश्यक है, की तरह pingया7z.exe
वेस लार्सन

के बजाय इंटरेक्टिव कमांड के लिए काम नहीं कर रहा है dir। उदाहरण: chkdsk /f c: > c:\Temp.txt | c:\Temp.txt। सिस्टम रिपोर्ट फ़ाइल किसी अन्य प्रक्रिया द्वारा अवरोधित है।
सोलापाजो डी एरियेरेज़

4
@lii re: handle output to stderr- 2>&1रिडायरेक्शन को जोड़ें तो यह इस तरह है: dir 2>&1 > a.txt & type a.txtऔर आपको stdr को stdout के साथ मिलाना चाहिए
जेसी चिशोल्म

97

यूनिक्स teeकमांड का एक Win32 पोर्ट है , जो ठीक यही करता है। Http://unxutils.sourceforge.net/ या http://getgnuwin32.sourceforge.net/ देखें


17
लिंक यूनिक्स कमांड टी के विंडोज कार्यान्वयन के लिए इंगित करता है, इसलिए यह विंडोज पर काम करता है।
ब्रायन रासमुसेन

3
हां, जवाब और टिप्पणी को मतदान करें। मैं वास्तव में CygWin पसंद करूंगा क्योंकि इसमें सब कुछ है लेकिन कुछ लोग गैर-DLL उपकरण पसंद करते हैं जिन्हें वे चुन सकते हैं और चुन सकते हैं।
paxdiablo

3
यूनिक्स उपयोगिताओं के बहुत सारे GnuWin32 परियोजना द्वारा पोर्ट किए गए हैं, gnuwin32.sourceforge.net देखें ।
व्लादिव जूल 17'09

2
UnxUtils अंतिम बार 2003 में अपडेट किया गया था; GnuWin32 कुछ अधिक अप-टू-डेट है।
क्विक

9
यदि आप, मेरी तरह, GnuWin32 के teeपैकेज को खोजने के लिए संघर्ष करते हैं , तो आप इसे gnuwin32.sourceforge.net/packages/coreutils.htm में पाएंगे
निगेल टच

49

इसे देखें: वाइनरी

साइबरविन की कोई आवश्यकता नहीं है।

मैंने मुठभेड़ की और कुछ मुद्दों की रिपोर्ट दी।

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

अंतिम, लेकिन कम से कम, यदि आपके पास पॉवरशेल है, तो आप टी-ऑब्जेक्ट की कोशिश कर सकते हैं। get-help tee-objectअधिक जानकारी के लिए PowerShell कंसोल में टाइप करें ।


4
क्यों गिरा वोट? यहां के 95% उत्तरों में एक बात समान है: प्रारंभिक कमांड समाप्त होने के बाद ही आउटपुट पुनर्निर्देशित किया जाता है: टिप्पणियों को पढ़ें। UNIX उपयोगिता teeआउटपुट वास्तविक समय। wteeसमान कार्यक्षमता है। यदि आप कीड़े को बुरा नहीं मानते हैं, तो यह ठीक रहेगा।
Davor

यह मेरे लिए एकमात्र समाधान है, जिसमें Powershell> 4.0 नहीं है। थम्स अप!
एलेक्स

46

@ tori3852

मैने पाया कि

dir > a.txt | type a.txt

काम नहीं किया (केवल dir लिस्टिंग की पहली कुछ पंक्तियाँ - किसी तरह की प्रक्रिया के लिए फ़ोर्किंग का संदेह है और दूसरा भाग, 'लिस्टिंग' से पहले 'dire लिस्टिंग' पूरा हो चुका है?), इसलिए इसके बजाय मैंने इस्तेमाल किया:

dir > z.txt && type z.txt

जो किया - अनुक्रमिक कमांड, दूसरा शुरू होने से पहले पूरा होता है।


17
आप का उपयोग करना चाहिए &के बजाय &&यदि आप सुनिश्चित करना चाहते हैं typeकमांड निष्पादित किया जाता है, भले ही dirआदेश विफल रहा है। यह तब उपयोगी है जब आपके कमांड में कुछ त्रुटि थी और आप अभी भी कंसोल पर लॉग फाइल देखना चाहते हैं। इस पर Microsoft का लेख देखें । हालाँकि, इसमें %errorlevel%त्रुटि के स्तर पर सेट होने का मुद्दा है type(जो 0 होगा)।
ADTC

25

दुर्भाग्य से ऐसी कोई बात नहीं है।

विंडोज कंसोल एप्लिकेशन में केवल एक ही आउटपुट हैंडल होता है। (ठीक है, दो हैं STDOUT, STDERRलेकिन यहां कोई फर्क नहीं पड़ता) >सामान्य रूप से कंसोल हैंडल को फ़ाइल हैंडल पर लिखे गए आउटपुट को रीडायरेक्ट करता है।

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


3
teeऑन * निक्स भी एक अलग अनुप्रयोग है, शेल पर कुछ पुनर्निर्देशन नहीं
phuclv

22

एक सरल सी # कंसोल एप्लिकेशन चाल करेगा:

using System;
using System.Collections.Generic;
using System.IO;

namespace CopyToFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            var buffer = new char[100];
            var outputs = new List<TextWriter>();

            foreach (var file in args)
                outputs.Add(new StreamWriter(file));

            outputs.Add(Console.Out);

            int bytesRead;
            do
            {
                bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
                outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
            } while (bytesRead == buffer.Length);

            outputs.ForEach(o => o.Close());
        }
    }
}

इसका उपयोग करने के लिए आप प्रोग्राम में केवल स्रोत कमांड को पाइप करते हैं और जिस भी फाइल को आउटपुट डुप्लिकेट करना चाहते हैं उसका पथ प्रदान करते हैं। उदाहरण के लिए:

dir | CopyToFiles files1.txt files2.txt 

Dir के परिणामों को प्रदर्शित करेगा और साथ ही परिणाम को files1.txt और files2.txt दोनों में संग्रहीत करेगा।

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


5
हम्म, कुछ भी नहीं के लिए टीई / साइबर डाउनलोड करें या उस तरह से एक छोटे से प्रोग्राम के लिए मेरी कड़ी मेहनत से अर्जित नकद के साथ एमएसवीएस खरीदें? यह एक कठिन है :-)
paxdiablo

19
आपको यह समझने के लिए दृश्य स्टूडियो की आवश्यकता नहीं है कि, कमांडलाइन टूल वास्तव में मुफ्त हैं। लिंक के लिए सिर्फ Google ".net sdk डाउनलोड" (सीधा लिंक चारों ओर बदलने लगता है लेकिन Google हमेशा काम करता है)।
क्रिस

13
विजुअल स्टूडियो एक्सप्रेस भी मुफ्त है, लेकिन मैं अभी भी इसके लिए टी का उपयोग करूंगा।
ब्रायन रासमुसेन

7
साइबरविन स्थापित करने के लिए एक दर्द है। आप को अपवित्र करें क्योंकि यही वह है जिसकी मुझे तलाश थी।
समौरसा

1
मुझे नहीं लगता कि यह आउटपुट कंसोल और फाइलों पर एक ही समय में होता है?
mjaggard

20

यह काम करता है, हालांकि यह थोड़ा बदसूरत है:

dir >_ && type _ && type _ > a.txt

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

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

हाँ, आप बस ECHO स्टेटमेंट (एक बार स्क्रीन के लिए और दूसरी बार लॉगफ़ाइल पर पुनर्निर्देशित कर सकते हैं) को दोहरा सकते हैं, लेकिन यह सिर्फ उतना ही बुरा लगता है और एक मेंटेनेंस समस्या का एक सा है। कम से कम इस तरह से आपको दो स्थानों पर संदेशों में परिवर्तन करने की आवश्यकता नहीं है।

ध्यान दें कि _ केवल एक छोटा फ़ाइल नाम है, इसलिए आपको अपनी बैच फ़ाइल के अंत में इसे हटाना सुनिश्चित करना होगा (यदि आप बैच फ़ाइल का उपयोग कर रहे हैं)।


2
यह केवल तभी उपयोगी है जब आप उन सामग्रियों को प्रदर्शित करना चाहते हैं जिन्हें आपकी प्रक्रिया ने चलाया है। और यह हल करने के लिए एक कठिन समस्या नहीं है।
क्रिस्टोफर पेंटर

1
हाँ, मुझे लगता है कि यह मूल पोस्टर से जो पूछ रहा था उससे थोड़ा अलग समस्या है।
एमटीएस

1
+1 यह है कि मैंने इसे हमेशा किया है। मेरा मानना ​​है कि यह मूल प्रश्न का सही उत्तर है और इसे चिह्नित किया जाना चाहिए। ट्रिक, जैसा कि @MTS पर संकेत देता है, यह है कि आप वास्तव में दो फ़ाइलों को लिखते हैं: एक जो प्रत्येक कमांड / लाइन (इसलिए एक एकल ">" जो हर बार ओवरराइट करता है) के अनुसार बनाई जाती है, और फिर आप उस लाइन को स्क्रीन पर टाइप करते हैं ( प्रकार ), और अंत में, आप इसे फिर से टाइप करते हैं और इसके आउटपुट को पुनर्निर्देशित करते हैं, सभी लंबे APPENDING, ">>" के साथ आपकी लॉग फ़ाइल में। इस तरह से मैंने इसे सालों तक किया है, हालांकि मुझे सरल " " टेम्प फाइल पसंद है। मैंने हमेशा "tmp.txt" या soemthing किया है। हाँ, इसे बाद में हटा दें।
eduncan911

यह एक अच्छा दृष्टिकोण है, लेकिन मुझे कुछ त्रुटियों के साथ समस्या थी जो कैप्चर नहीं हो रही थीं। typeअलग-अलग पंक्तियों पर (एक सबरूटीन में) कमांड डालते हुए तय किया कि हालांकि।
नैट कुक

बस मुझे अपने आवेदन के लिए क्या चाहिए था।
एलन

16

mtee एक छोटी सी उपयोगिता है जो इस उद्देश्य के लिए बहुत अच्छी तरह से काम करती है। यह मुफ़्त है, स्रोत खुला है, और यह काम करता है।

आप इसे http://www.commandline.co.uk पर पा सकते हैं ।

आउटपुट प्रदर्शित करने और लॉग फ़ाइल एक साथ बनाने के लिए एक बैच फ़ाइल में उपयोग किया जाता है, वाक्यविन्यास इस तरह दिखता है:

    someprocess | mtee /+ mylogfile.txt

जहां / + का मतलब आउटपुट जोड़ना है।

यह मानता है कि आपने mtee को एक फ़ोल्डर में कॉपी किया है, जो कि PATH में है।


1
यह फ़ाइल या कंसोल के आउटपुट से पहले आउटपुट के पूरा होने तक प्रतीक्षा करने के लिए लगता है।
मेलमोकब

14

मैं सैक्सन ड्रूस के उत्कृष्ट उत्तर पर थोड़ा विस्तार करना चाहता हूं ।

जैसा कि कहा गया है, आप मौजूदा निर्देशिका में निष्पादन योग्य के आउटपुट को पुनर्निर्देशित कर सकते हैं जैसे:

powershell ".\something.exe | tee test.txt"

हालाँकि, यह केवल लॉग करता stdoutहै test.txt। यह भी लॉग इन नहीं करता है stderr

स्पष्ट समाधान कुछ इस तरह का उपयोग करना होगा:

powershell ".\something.exe 2>&1 | tee test.txt"

हालाँकि, यह सभी के लिए काम नहीं करेगा something.exe। कुछ लोग तर्क something.exeके 2>&1रूप में व्याख्या करेंगे और असफल होंगे। सही समाधान इसके बजाय केवल something.exeइसके और इसके तर्कों और उसके चारों ओर apostrophes है, जैसे:

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt

मैंने यह कोशिश की जब विंडोज़ 10 पर pyqt5.7 का निर्माण, यह काफी सुस्त है, कंसोल आउटपुट रीयलटाइम नहीं है, शायद यह बफर है? लॉग फ़ाइल सही लगती है
शुमन

3
वह सब पूरी तरह से गलत है। यह मेरे लिए बिल्कुल काम नहीं करता है। अंतिम आदेश 'tee' is not recognized as an internal or external commandस्पष्ट कारणों के लिए देता है। साथ 2>&1अंदर cmd लाइन stderr के लिए किसी भी उत्पादन powershell से त्रुटियों का कारण बनता।
पावेल पी

PowerShell टी-ऑब्जेक्ट cmdlet का संदर्भ हो सकता है - Technet.microsoft.com/en-us/library/ee177014.aspx
Bernd

9

मैं ब्रायन रासमुसेन से सहमत हूं, unxutils पोर्ट ऐसा करने का सबसे आसान तरीका है। उनके स्क्रिप्टिंग पेज रॉब वैन डेर वूडे के बैच फाइल सेक्शन में MS-DOS और CMD कमांड के उपयोग की जानकारी दी गई है। मुझे लगा कि आपके पास आपकी समस्या का एक देशी समाधान हो सकता है और वहां पर खुदाई करने के बाद मैंने टीईई.बीएटी पाया , जो कि बस एक एमएस-डॉस बैच भाषा टी के कार्यान्वयन के लिए प्रतीत होता है। यह एक बहुत ही जटिल दिखने वाली बैच फ़ाइल है और मेरा झुकाव अभी भी unxutils पोर्ट का उपयोग करने के लिए होगा।


वह टीबट बात अच्छी लगती है। उम्मीद है कि ओपी इसकी जांच करेगा।
Jay

10
ध्यान दें कि कमांड पूरा होने के बाद TEE.BAT का उपयोग करना, "dir> a.txt; a.txt" की तरह ही आस-पास पोस्ट किया गया उदाहरण होगा।
adzm

8

यदि आपके पास अपनी खिड़कियों के वातावरण के मार्ग में साइबरविन है तो आप इसका उपयोग कर सकते हैं:

 dir > a.txt | tail -f a.txt

7
यदि आप Cygwin का उपयोग करने जा रहे हैं, तो यह टी के साथ आता है।
श्री लामा

7

dir 1>a.txt 2>&1 | type a.txt

यह STDOUT और STDERR दोनों को पुनर्निर्देशित करने में मदद करेगा


यह काम नहीं करता है। मैंने JBoss run.bat को लॉन्च करने के लिए इसका उपयोग करने की कोशिश की और यह स्टार्टअप के दौरान चोक हो गया और सर्वर फ्रीज हो गया। इस पद्धति के साथ समस्याएं हैं ...
djangofan

@ आरजा अशोक, मेरे लिए काम नहीं करता है। मैंने python.exe 1> file.txt 2> & 1
neo

4

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

@if (@CodeSection == @Batch) @then


@echo off
setlocal EnableDelayedExpansion

rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala

rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed

if "%~1" equ "" (
   echo Duplicate the Stdout output of a command in the screen and a disk file
   echo/
   echo anyCommand ^| APATee teeFile.txt [/A]
   echo/
   echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
   goto :EOF
)

if "%2" equ ":TeeProcess" goto TeeProcess

rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"

rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1

rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF

:TeeProcess
   rem Wait for "Data Available" signal
   if not exist Flag.in goto TeeProcess
   rem Read the line sent by JScript section
   set line=
   set /P line=
   rem Set "Data Read" acknowledgement
   ren Flag.in Flag.out
   rem Check for the standard "End Of piped File" mark
   if "!line!" equ ":_EOF_:" exit /B
   rem Correctly manage CLS command
   if "!line:~0,1!" equ "!cls!" (
      cls
      set "line=!line:~1!"
   )
   rem Duplicate the line in Stdout and the Tee output file
   echo(!line!
   echo(!line!>> %1
goto TeeProcess


@end


// JScript section

var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) {
   // Read the next line from Stdin
   var line = WScript.Stdin.ReadLine();
   // Wait for "Data Read" acknowledgement
   while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
   }
   // Send the line to Batch section
   WScript.Stdout.WriteLine(line);
   // Set "Data Available" signal
   fso.MoveFile("Flag.out", "Flag.in");
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
}
// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");

किसी भी तरह से इस stderr उत्पादन पर कब्जा कर सकता है? मेरे पास एक कष्टप्रद निर्वासन है जो मानक त्रुटि स्ट्रीम पर सब कुछ आउटपुट करता है (यानी सामान्य रूप से एक फ़ाइल में आउटपुट के लिएfile.exe 2>output.txt
मार्क देवेन

मैं यह समझ गया। आप इसे file.exe 2>&1|tee.batयहाँ पाए गए अनुसार प्रयोग कर सकते हैं : superuser.com/questions/452763/…
मार्क देवेन

4

मैं भी इसी समाधान की तलाश में था, थोड़ी कोशिश के बाद, मैं सफलतापूर्वक कमांड प्रॉम्प्ट में इसे प्राप्त करने में सक्षम था। यहाँ मेरा समाधान है:

@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on

यह किसी भी PAUSE कमांड को भी कैप्चर करता है।


3

यहाँ एक नमूना है जो मैंने अन्य उत्तरों में से एक के आधार पर उपयोग किया है

@echo off
REM SOME CODE
set __ERROR_LOG=c:\errors.txt
REM set __IPADDRESS=x.x.x.x

REM Test a variable
if not defined __IPADDRESS (
     REM Call function with some data and terminate
     call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
     goto :EOF
)

REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF


REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
     >  CON ECHO.%%Z
     >> "%__ERROR_LOG%" ECHO.%%Z
     goto :EOF
)

3

इस तरह से कुछ करना चाहिए जो आपको चाहिए?

%DATE%_%TIME% > c:\a.txt & type c:\a.txt
ipconfig >> c:\a.txt & type c:\a.txt
ping localhost >> c:\a.txt & type c:\a.txt
pause

लगभग, लेकिन यह एक साथ प्रदर्शित नहीं होता है - यदि आपके पास लंबे समय तक चलने वाला कार्य है, तो आपको लंबे समय तक कोई परिणाम नहीं मिलेगा।
जस्टअमार्टिन

3

कंसोल को आउटपुट भेजें, कंसोल लॉग में संलग्न करें, वर्तमान कमांड से आउटपुट हटाएं

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1

8
यहाँ क्या चल रहा है यह समझाने के लिए परवाह है?
जॉन डेमेट्रियॉ

2

यह एमटीएस के पिछले उत्तर पर एक बदलाव है , हालांकि इसमें कुछ कार्यक्षमता है जो दूसरों के लिए उपयोगी हो सकती है। यहाँ विधि है कि मैं इस्तेमाल किया है:

  • एक कमांड को एक वेरिएबल के रूप में सेट किया जाता है, जिसे बाद में पूरे कोड में इस्तेमाल किया जा सकता है, कमांड विंडो में आउटपुट करने के लिए और लॉग फाइल में अप्लाई करते हुए, set _Temp_Msg_Cmd=
    • कमांड को गाजर वर्ण का उपयोग करके पुनर्निर्देशित किया गया है ^ताकि कमांड का मूल्यांकन शुरू में न हो
  • एक अस्थायी फ़ाइल को बैच फ़ाइल के समान फ़ाइल नाम के साथ बनाया जाता %~n0_temp.txtहै जिसे कहा जाता है जो बैच फ़ाइल का नाम पाने के लिए कमांड लाइन पैरामीटर एक्सटेंशन सिंटैक्स का उपयोग करता है %~n0
  • आउटपुट को एक अलग लॉग फ़ाइल में जोड़ा जाता है %~n0_log.txt

यहाँ आदेशों का क्रम है:

  1. आउटपुट और त्रुटि संदेश अस्थायी फ़ाइल को भेजे जाते हैं ^> %~n0_temp.txt 2^>^&1
  2. अस्थायी फ़ाइल की सामग्री तब दोनों है:
    • लॉगफ़ाइल में जोड़ा गया ^& type %~n0_temp.txt ^>^> %~n0_log.txt
    • कमांड विंडो में आउटपुट ^& type %~n0_temp.txt
  3. संदेश वाली अस्थायी फ़ाइल हटा दी गई है ^& del /Q /F %~n0_temp.txt

यहाँ उदाहरण है:

set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt

इस तरह तब कमांड को एक बैच फाइल में बाद की कमांड के बाद जोड़ा जा सकता है जो बहुत साफ दिखता है:

echo test message %_Temp_Msg_Cmd%

इसे अन्य कमांड के अंत में भी जोड़ा जा सकता है। जहां तक ​​मैं बता सकता हूं कि यह काम करेगा जब संदेशों में कई लाइनें होंगी। उदाहरण के लिए यदि कोई त्रुटि संदेश है, तो निम्न आदेश दो पंक्तियों को आउटपुट करता है:

net use M: /D /Y %_Temp_Msg_Cmd%


1
@echo on

set startDate=%date%
set startTime=%time%

set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100


fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat

यह वर्तमान डेटाटाइम के साथ एक लॉग फ़ाइल बनाएगा और आप प्रक्रिया के दौरान कंसोल लाइनें कर सकते हैं


11
क्या आप एक ही कार्यक्रम को दो बार नहीं कर रहे हैं?
एल्कूल

1

मैं कमांड आउटपुट को एक बार में एक लाइन प्राप्त करने के लिए "for" स्टेटमेंट के साथ बैच सबरूटीन का उपयोग करता हूं और दोनों उस लाइन को फाइल में लिखते हैं और इसे कंसोल में आउटपुट करते हैं।

@echo off
set logfile=test.log

call :ExecuteAndTee dir C:\Program Files

Exit /B 0

:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
  for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0

मैं ऐसा ही करता हूं जब एक कमांड से आउटपुट कैप्चर करने की कोशिश करता है (IE इसे अंदर डाल देता है) लेकिन फिर मैं स्क्रीन पर इको करने के लिए अपने मानक सबफंक्शन को कॉल करता हूं और लॉग को लिखता हूं क्योंकि मैं इको का उपयोग करने के प्रतिस्थापन में इसे अपनी स्क्रिप्ट में उपयोग करता हूं । यकीन नहीं है कि क्यों दूसरों से एक downvote मिला तो मैं इसे upvote।
बेन पर्सिक

1

यदि आप सीएलआई पर हैं, तो आप जो भी चाहते हैं, उसके लिए एक लूप का उपयोग न करें:

for /F "delims=" %a in ('dir') do @echo %a && echo %a >> output.txt

लूप के लिए विंडोज सीएमडी पर महान संसाधन: https://ss64.com/nt/for_cmd.html यहाँ की कुंजी सीमांकक (डेलिम्स) स्थापित कर रही है, जो आउटपुट की प्रत्येक पंक्ति को तोड़ देगी, कुछ भी नहीं। इस तरह यह सफेद-स्थान के डिफ़ॉल्ट पर नहीं टूटेगा। % एक एक मनमाना पत्र है, लेकिन इसका उपयोग "डू" सेक्शन में किया जाता है, ठीक है ... प्रत्येक पंक्ति में पार्स किए गए वर्णों के साथ कुछ करें। इस मामले में हम अपने चयन की एक फ़ाइल बनाने या जोड़ने (>>) के लिए 2 इको कमांड निष्पादित करने के लिए ampersands (&&) का उपयोग कर सकते हैं। डीओ आदेशों के इस आदेश को सुरक्षित रखने के लिए, यदि फ़ाइल लिखने में कोई समस्या है, तो हम कम से कम पहले कंसोल को प्रतिध्वनि प्राप्त करेंगे। पहली प्रतिध्वनि के सामने साइन (@) कंसोल को इको-कमांड दिखाने से रोकता है, और इसके बजाय केवल कमांड का परिणाम प्रदर्शित करता है जो कि वर्णों को% a में प्रदर्शित करना है। अन्यथा आप देखेंगे:

ड्राइव में एक्सो वॉल्यूम [x]
ड्राइव में विंडोज वॉल्यूम है [x] विंडोज है

अद्यतन: / एफ खाली लाइनों को छोड़ देता है और केवल फिक्स प्रत्येक पंक्ति में एक चरित्र को जोड़ने के उत्पादन को पूर्व-फ़िल्टर करने के लिए है (शायद कमांड खोजने के माध्यम से लाइन-संख्याओं के साथ)। सीएलआई में इसे हल करना त्वरित या सुंदर नहीं है। इसके अलावा, मैंने STDERR को शामिल नहीं किया है, इसलिए यहाँ गलतियाँ भी हैं:

for /F "delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt

त्रुटि संदेश पुनर्निर्देशित करना

उनके बाद प्रतीकों से बचने के लिए देखभाल (^) होती है, क्योंकि कमांड एक स्ट्रिंग है जिसकी व्याख्या की जा रही है, जैसा कि कहने का विरोध किया गया है, इसे सीधे कमांड-लाइन पर दर्ज करना है।


1

बस यूनिक्स की तरह।

dir | tee a.txt

विंडोज एक्सपी पर काम करता है, इसे mksntस्थापित करने की आवश्यकता है।

यह प्रॉम्प्ट पर प्रदर्शित होने के साथ-साथ फाइल पर भी निर्भर करता है।


0

यदि आप वास्तव में स्क्रीन पर देखी गई चीज़ चाहते हैं, तो निम्नलिखित मदद करता है - भले ही बैच फ़ाइल को किसी फ़ाइल में रीडायरेक्ट किया गया हो। अगर डिवाइस को किसी फ़ाइल में रीडायरेक्ट किया जाता है, तो शायद CON का उपयोग किया जाता है

उदाहरण:

ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected  >CON
ECHO fourth line on normal stdout again. maybe redirected

अच्छा पुनर्निर्देशन विवरण भी देखें: http://www.p-dd.com/chapter7-page14.html


0

मैं किसी फ़ाइल में आउटपुट और रीडायरेक्ट कैसे प्रदर्शित करूं। मान लीजिए अगर मैं dos कमांड, dir> test.txt का उपयोग करता हूं, तो यह कमांड परिणाम को प्रदर्शित किए बिना test.txt को फाइल करने के लिए आउटपुट को रीडायरेक्ट करेगा। कैसे DOS यानी, विंडोज़ कमांड प्रॉम्प्ट का उपयोग करके फ़ाइल में आउटपुट और रीडायरेक्ट आउटपुट प्रदर्शित करने के लिए एक कमांड लिखने के लिए नहीं, UNIX / LINUX में।

आप इन आदेशों को बिटर्सस्क्रिप्टिंग ( http://www.biterscripting.com ) में उपयोगी पा सकते हैं ।

var str output
lf > $output
echo $output                            # Will show output on screen.
echo $output > "test.txt"               # Will write output to file test.txt.
system start "test.txt"                 # Will open file test.txt for viewing/editing.

0

यह वास्तविक समय में काम करता है लेकिन यह भी बदसूरत है और प्रदर्शन धीमा है। अच्छी तरह से परीक्षण नहीं किया गया:

@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
  ECHO %%I
  ECHO %%I >> out.txt
) 
pause

6
नहीं, यह वास्तविक समय नहीं है, यह %MYCOMMAND%समाप्त होने तक इंतजार करता है और यह कई मामलों में विफल रहता है। यह खाली लाइनों को छोड़ देता है, लाइनों शुरुआत के साथ ;की तरह सामग्री के साथ विफल रहता है <space>/<TAB>, ON, OFFया /?। लेकिन बाकी कभी-कभी काम कर सकते हैं :-)
jeb

0

एक विकल्प है अपने कार्यक्रम के भीतर stderr को steout करना:

जावा में:

System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));

फिर, अपने डॉस बैचफाइल में: java program > log.txt

स्टडआउट लॉगफ़ाइल में जाएगा और स्ट्रैंडर (एक ही डेटा) कंसोल पर दिखाई देगा।


0

मैं अपनी अधिकांश मशीनों पर पर्ल स्थापित करता हूं, इसलिए पर्ल: टी.ई.पी.

my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)
{
    print $_;
    print $output $_;
}
close $output;

dir | perl tee.pl या dir | perl tee.pl dir.bat

कच्चा और अप्रकाशित।


0

एक और भिन्नता पाइप को विभाजित करने के लिए है, और फिर जैसा आप चाहें आउटपुट को फिर से निर्देशित करें।

    @echo off
    for /f "tokens=1,* delims=:" %%P in ('findstr /n "^"') do (
      echo(%%Q
      echo(%%Q>&3
    )
    @exit/b %errorlevel%

ऊपर .bat फ़ाइल में सहेजें। यह फाइलस्ट्रीम 1 से फाइलस्ट्रीम 3 पर भी टेक्स्ट आउटपुट को विभाजित करता है, जिसे आप आवश्यकतानुसार रीडायरेक्ट कर सकते हैं। नीचे दिए गए मेरे उदाहरणों में, मैंने उपरोक्त स्क्रिप्ट को विभाजित किया।

    dir | splitPipe.bat  1>con  2>&1  3>my_stdout.log

    splitPipe.bat 2>nul < somefile.txt

-1
  1. https://cygwin.com/install
  2. "Setup-x86_.exe" के लिंक पर क्लिक करें
  3. इंस्टॉलर चलाएं
  4. ~ 2 पेज पर, डाउनलोड करने के लिए एक "दर्पण" चुनें (मैंने एक .edu डोमेन के लिए देखा था)
  5. मैंने मानक विकल्पों के लिए ठीक कहा
  6. साइगविन जल्दी से स्थापित समाप्त हो गया
  7. सेमी खोलें
  8. टाइप करें c:\cygwin64\bin\script.exeऔर एंटर करें
  9. टाइप करें cmdऔर एंटर करें
  10. अपना प्रोग्राम चलाएं
  11. टाइप करें exitऔर दर्ज करें (Cygwin's cmd.exe से बाहर निकलें)
  12. टाइप करें exitऔर दर्ज करें (Cygwin's script.exe से बाहर निकलें)
  13. "टाइपस्क्रिप्ट" नामक पाठ फ़ाइल में अपने कार्यक्रम का स्क्रीन आउटपुट देखें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.