बैच फ़ाइल के भीतर से पुनर्निर्देशन आउटपुट


110

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

मैंने सभी कमांड को एक बैच फ़ाइल में इकट्ठा किया, और यह चलता है, लेकिन मैं बैच फाइल को पसंद करूंगा, जब परिणाम को टेक्स्ट फाइल (लॉग) में आउटपुट करने के लिए चलाया जाएगा। क्या कोई ऐसा आदेश है जिसे मैं उस बैच में जोड़ सकता हूं जो ऐसा करेगा?

ध्यान रखें कि मैं cmd ​​से बैच नहीं चलाना चाहता, फिर आउटपुट को रीडायरेक्ट करना; मैं बैच के अंदर से आउटपुट को पुनर्निर्देशित करना चाहता हूं, अगर यह संभव है।

जवाबों:


161

सरल भोला तरीका जो धीमा है क्योंकि यह फ़ाइल पॉइंटर को कई बार एंड-टू-फाइल के लिए खोलता और स्थिति देता है।

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

एक बेहतर तरीका - लिखना आसान है, और तेज़ है क्योंकि फ़ाइल को केवल एक बार खोला और पोस्ट किया गया है।

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

एक और अच्छा और तेज़ तरीका जो केवल एक बार फाइल को खोलता और रखता है

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

2020-04-17 को संपादित करें

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

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

मैंने रिवर्स ऑर्डर में हैंडल 9 और 8 का उपयोग करना चुना क्योंकि एक ही कमांड पर कई पुनर्निर्देशन करते समय Microsoft पुनर्निर्देशन कार्यान्वयन डिज़ाइन दोष के कारण संभावित स्थायी पुनर्निर्देशन से बचने की संभावना अधिक होती है । यह अत्यधिक संभावना नहीं है, लेकिन यहां तक ​​कि अगर आप काफी प्रयास करते हैं तो यह तरीका बग को उजागर कर सकता है। यदि आप समस्या से बचने के लिए गारंटी की तुलना में पुनर्निर्देशन को चरणबद्ध करते हैं।

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

2
उन समाधानों से प्यार करें जहां मैं इसे फ़ाइल के शेष भाग के लिए सेट कर सकता हूं
सैम

3
ध्यान दें कि कॉल समाधान आपके % 0 को बदलता है ( इस मामले में उप करने के लिए ) जो आप चाहते हैं या नहीं हो सकता है।
Jannes

1
@Jeses - सच है, लेकिन यदि आप एक संशोधक जोड़ते हैं तो आप हमेशा रनिंग बैच स्क्रिप्ट के बारे में जानकारी प्राप्त कर सकते हैं। उदाहरण के लिए, %~f0हमेशा बैच स्क्रिप्ट को पूरा रास्ता देता है, तब भी जब एक CALLed: सबरूटीन के अंदर हो।
डेंभम

3
@ThariqNugrohotomo ->output.txt 2>&1
dbenham

2
@ नमोन्द्रा - जो एक ही स्क्रिप्ट के भीतर लेबल किए गए सबरूटीन को कॉल करने के लिए मानक बैच सिंटैक्स है। प्रलेखन के लिए कंसोल कमांड लाइन से निष्पादित करें cmd /?या help cmdकरें। तीसरी विधि की चाल यह है कि CALL पर पुनर्निर्देशन CALLed उप-रेखा के भीतर सभी आदेशों पर लागू होता है।
debhamham

66

यदि आप चाहते हैं कि दोनों गलत धाराएँ पुनर्निर्देशित हों

dir >> a.txt 2>&1

27
+1। यह भी इंगित करने योग्य है कि उपयोग करने से क्या >>होगा a.txt। इसके a.txtबजाय अधिलेखित करने के लिए, का उपयोग करें >stackoverflow.com/q/4458231/1098302
हारून

नमस्ते, क्या कंसोल पर आउटपुट को पुनर्निर्देशित करने का कोई तरीका है?
संदीप सिंह

यह क्या करता है
कल्पेश

16

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन कोई व्यक्ति इसे Google खोज में ठोकर खाएगा और यह भी दिखता है कि कुछ प्रश्न जो ओपी ने टिप्पणियों में पूछे थे, वे विशेष रूप से संबोधित नहीं किए गए थे। इसके अलावा, कृपया मुझ पर आसान काम करें क्योंकि यह एसओ पर पोस्ट किया गया मेरा पहला उत्तर है। :)

डायनामिक रूप से जेनरेट किए गए फ़ाइल नाम का उपयोग करके किसी फ़ाइल में आउटपुट को रीडायरेक्ट करने के लिए, मेरा गो-टू (रीड: क्विक एंड डर्टी) दृष्टिकोण @dbenham द्वारा प्रस्तुत दूसरा समाधान है। उदाहरण के लिए, यह:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

आप एक फाइल बनाएंगे जैसा आप लक्ष्य निर्देशिका में फ़ाइल के इस स्क्रीनशॉट में देखते हैं

इसमें यह आउटपुट शामिल होगा:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

यह भी ध्यान रखें कि यह समाधान स्थानीय-निर्भर है, इसलिए इसका उपयोग कैसे / कब करें, इसके बारे में सावधान रहें।


धन्यवाद यह उपयोगी था। क्विक क्वेश्चन एक वजह है कि आप क्यों इस्तेमाल कर रहे हैं .log बनाम .txt? क्या इससे कुछ अन्तर पड़ता है?
मूंदड़ा

1
@ नहीं, यह नहीं है। यह इस मामले में सिर्फ शब्दार्थ है। यह कहना नहीं है कि फ़ाइल प्रकार के आधार पर ऐसे एप्लिकेशन नहीं होते हैं, जिनकी आवश्यकता / grep हो, इसलिए बस इस बात से अवगत रहें कि आपकी फ़ाइलों का उपयोग कैसे किया जा रहा है।
एंथनी

9
echo some output >"your logfile"

या

(
 echo some output
 echo more output
)>"Your logfile"

बिल भरना चाहिए।

यदि आप APPENDआउटपुट चाहते हैं , तो >>इसके बजाय का उपयोग करें >>एक नया लॉगफ़ाइल शुरू करेगा।


9
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause

मुझे लगता है कि यह सबसे सुंदर तरीका है। धन्यवाद वेस्ले!
किसविजय

5

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

some_command  ^|  TEE.BAT  [ -a ]  filename 


3
@echo OFF
[your command] >> [Your log file name].txt

मैंने अपने बैच फ़ाइल में ऊपर कमांड का उपयोग किया है और यह काम करता है। लॉग फ़ाइल में, यह मेरी कमांड के परिणाम दिखाता है।


3

अपने बैच फ़ाइल के शीर्ष के पास इन दो पंक्तियों को जोड़ें, सभी stdout और stderr के बाद log.txt पर पुनर्निर्देशित किया जाएगा:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1

यह मेरे लिए काम किया, धन्यवाद। कोई विशेष विचार जहां यह विफल हो सकता है? (उदा। आउटपुट साइज़ ओवरफ़्लो)
CCarlos

नमस्कार, आपके जवाब के लिए धन्यवाद! क्या यह कंसोल पर भी पुनर्निर्देशित करने का कोई तरीका है?
संदीप सिंह

0

यह इनपुट में "विषाक्त" वर्णों के मामले में विफल हो सकता है। इस तरह के इनपुट को ध्यान में रखते हुए ^ ^ ^ ^ ^ ^ ^ एक अच्छा तरीका है कि कैसे समझें कि क्या चल रहा है। सुनिश्चित करें कि एक नियम है कि इनपुट स्ट्रिंग डबल उद्धृत चिह्नों के अंदर होना चाहिए, लेकिन मुझे लगता है कि यह नियम केवल एक वैध नियम है यदि इनपुट का अर्थ NTFS विभाजन पर एक स्थान है (शायद यह URL के लिए एक नियम है I मुझे यकीन नहीं है)। लेकिन यह निश्चित रूप से एक मनमाना इनपुट स्ट्रिंग के लिए एक नियम नहीं है (यह "एक अच्छा अभ्यास" है, लेकिन आप इसके साथ गिनती नहीं कर सकते हैं)।


0

अपनी बैच फ़ाइल के निचले भाग में निम्नलिखित पंक्तियों को जोड़ने से सीएमडी विंडो के अंदर प्रदर्शित की गई हर चीज हड़प जाएगी और पाठ फ़ाइल में निर्यात हो जाएगी:

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

यह मूल रूप से सभी चुनिंदा -> कॉपीबोर्ड में कॉपी -> टेक्स्ट फाइल में पेस्ट करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.