यदि मैं कार्य शेड्यूलर द्वारा चलाया जा रहा है तो मैं किसी स्क्रिप्ट के आउटपुट को कैसे कैप्चर कर सकता हूं?


93

विंडोज सर्वर 2008 का उपयोग करके, मैं एक स्क्रिप्ट के आउटपुट को कैप्चर करने के बारे में कैसे जाऊं जो विंडोज़ टास्क शेड्यूलर के साथ चल रहा है?

मैं एक लंबे समय तक कस्टम प्रिंटिंग बैच-स्क्रिप्ट का परीक्षण कर रहा हूं, और डिबगिंग उद्देश्यों के लिए, मैं हर रात इसे से सभी आउटपुट देखना चाहूंगा।


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

जवाबों:


82

टास्क शेड्यूलर में कमांड स्ट्रिंग के रूप में इसे आज़माएं:

cmd /c yourscript.cmd > logall.txt

2
अच्छा, कोई रैपर की आवश्यकता नहीं है, महान काम करता है, और चाइल्ड पॉवरशेल स्क्रिप्ट से आउटपुट भी लॉग करता है जिसे टास्क-शेड्यूलर-ट्रिगर बैट / cmd से बुलाया जाता है!
जोन्सोम ने मोनिका

8
इसके अतिरिक्त, cmd /c "path with spaces/command.cmd > file.txt"यदि आपके पास स्थान हैं तो उपयोग करें । 2>&1से इवान के जवाब भी कोट के अंदर चला जाता है।
दीनी

3
: दोहरे उद्धरण चिह्नों का उपयोग करने के काम करने के लिए मेरा प्राप्त करने की आवश्यकता stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
मुझे पता है कि यह 5 साल हो गया है, लेकिन कार्य को करने का न्यूनतम तरीका होने के लिए स्वीकार किए गए उत्तर में इसे बदल रहा है।
मेकफ्लैश

अब मेरे पास एक कमांड विंडो है जो कार्य चलाने के दौरान दिखाई देती है। इसे कैसे रोका जाए?
क्रिस

57

Stderr के साथ (जहां अधिकांश त्रुटियां जाती हैं):

cmd /c yourscript.cmd > logall.txt 2>&1

56

@ User2744787 के उत्तर के पूरक के लिए, यहाँ एक स्क्रीनशॉट दिखाया गया है कि cmdअनुसूचित कार्य में तर्कों के साथ कैसे उपयोग किया जाए:

Logfile को शेड्यूल्ड टास्क cmd आउटपुट

कार्यक्रम / स्क्रिप्ट: cmd

तर्क जोड़ें: /c run_with_default_port.bat > IMQuantWebServices.log


5
लगता है कि आप एक निर्धारित कार्य के माध्यम से एक सेवा शुरू कर रहे हैं। यदि यह पृष्ठभूमि में लगातार चलने वाली सेवा होनी चाहिए, तो विकल्प के रूप में NSSM पर एक नज़र डालें। यह एक खिड़कियों सेवा और विफलता आदि के बाद पुन: प्रारंभ करने के हैंडल के रूप में किसी भी कमांड चलाता है
leemes

43

>>बल्कि यह हर बार अधिलेखन से लॉग फ़ाइल संलग्न कर देगा। 2>&1भी अपने लॉग फ़ाइल के लिए त्रुटियों भेज देंगे।

cmd /c YourProgram.exe >> log.txt 2>&1

39

आपके पास एक debug.cmd हो सकता है, जो yourscript.cmd कहता है

yourscript.cmd > logall.txt

आप debcript.cmd की बजाय yourscript.cmd को शेड्यूल करें


10

cmd.exeअपने निर्धारित कार्य के आउटपुट को लॉग करने के लिए टाइमस्टैम्ड फ़ाइल नाम बनाने के लिए कमांड प्रोसेसर का उपयोग करें

यहां अन्य लोगों के उत्तरों का निर्माण करने के लिए, यह हो सकता है कि आप एक आउटपुट फ़ाइल बनाना चाहते हैं जिसमें फ़ाइल के नाम पर दिनांक और / या समय अंतर्निहित हो। आपके cmd.exeलिए ऐसा करने के लिए आप कमांड प्रोसेसर का उपयोग कर सकते हैं ।

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

PowerShellसे अधिक शक्तिशाली है कि अवगत रहें cmd.exe। एक तरीका यह अधिक शक्तिशाली है कि यह विभिन्न विंडोज क्षेत्रों से निपट सकता है। लेकिन यह जवाब इस मुद्दे को हल करने के बारे में है cmd.exe, नहीं PowerShell, इसलिए हम जारी रखते हैं।

का उपयोग करते हुए cmd.exe

आप आंतरिक वातावरण चर को स्लाइस करके दिनांक और समय के विभिन्न घटकों तक पहुँच सकते हैं %date%और %time%, इस प्रकार (फिर से, सटीक स्लाइसिंग मान विंडोज में कॉन्फ़िगर किए गए क्षेत्र पर निर्भर हैं):

  • वर्ष (4 अंक): %date:~10,4%
  • महीना (2 अंक): %date:~4,2%
  • दिन (2 अंक): %date:~7,2%
  • घंटा (2 अंक): %time:~0,2%
  • मिनट (2 अंक): %time:~3,2%
  • दूसरा (2 अंक): %time:~6,2%

मान लीजिए कि आप अपनी लॉग फ़ाइल को इस तिथि / समय प्रारूप का उपयोग करके नाम देना चाहते हैं: " Log_[yyyyMMdd]_[hhmmss].txt"। आप निम्नलिखित का उपयोग करेंगे:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

इसका परीक्षण करने के लिए, निम्न कमांड लाइन चलाएं:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

यह सब एक साथ रखें, रीडायरेक्ट करने के लिए दोनों stdoutऔर stderrवर्तमान दिनांक और समय के साथ नाम के एक लॉग फ़ाइल के लिए अपनी स्क्रिप्ट से, उपयोग अपने आदेश पंक्ति के रूप में निम्न का उपयोग कर सकता है:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

फ़ाइल नाम के आस-पास के उद्धरणों के उपयोग को ध्यान में रखें कि कोई दिनांक या समय घटक किसी स्थान वर्ण को प्रस्तुत कर सकता है।

मेरे मामले में, यदि वर्तमान तिथि / समय 10/05/2017 9:05:34 AM था, तो उपरोक्त कमांड-लाइन निम्नलिखित उत्पादन करेगी:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

10 से कम घंटे पर कोई अग्रणी शून्य नहीं है: / निश्चित नहीं कि कैसे ठीक करें लेकिन कम से कम फ़ाइल नाम को उद्धृत करें
user25064

9

आप लाइनों पर एक लॉग फ़ाइल को लिख सकते हैं जिसे आप इस तरह से आउटपुट करना चाहते हैं:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

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


1

उदाहरण के लिए कार्यक्रम कैसे चलाएं और टाइमस्टैम्प के साथ फाइल करने के लिए stdout और stderr लिखें:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

मुख्य भाग पूरे भाग के पीछे दोहरे भाग को दोहराता है cmd /cऔर इसके अंदर हमेशा की तरह दोहरे उद्धरण चिह्नों का उपयोग करता है। यह भी ध्यान दें कि तारीख स्थानीय निर्भर है, यह उदाहरण अमेरिकी लोकेल का उपयोग करके काम करता है।


0

यह स्निपेट तारीख स्ट्रिंग बनाने के लिए wmic.exe का उपयोग करता है। यह लोकेल सेटिंग द्वारा मंगाई नहीं गई है

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.