2009-04-11 17 views
17

स्क्रिप्ट को पूरा करने के समय की गणना करने के लिए मैं एक स्क्रिप्ट कैसे लिख सकता हूं?बैच फ़ाइल निष्पादित करने में कितनी देर लगती है?

मुझे लगा कि यह मामला होगा, लेकिन स्पष्ट रूप से नहीं ..

@echo off 
set starttime=%time% 
set endtime=%time% 

REM do stuff here 

set /a runtime=%endtime%-%starttime% 
echo Script took %runtime% to complete 
+1

shouldn ' क्या आप कुछ सामान करने के बाद एंडटाइम सेट करते हैं? क्या यह एक टाइपो है? –

+0

अच्छी तरह से, आप बस "समय ./myscript" – mpen

+0

@mark, एक स्टॉक विंडोज स्थापना में कर सकते हैं, समय सीएमडी.एक्सईई में बनाया गया एक आदेश है जो दिन के वर्तमान समय को सेट या प्रदर्शित करता है। – RBerteig

उत्तर

1

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

बाद वाले को कैसे करें इसके उदाहरण के लिए this forum thread के नीचे एक नज़र डालें।

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

2

मेरा अपना निजी पसंद Cygwin स्थापित करने और time आदेश का उपयोग करें, लेकिन, अगर आप वास्तव में एक बैच फ़ाइल के रूप में क्या करना है करने के लिए है, तो आप सिर्फ तार घटाना नहीं कर सकते हैं, तो आप उन्हें हिस्से के रूप में इलाज के लिए की है।

निम्नलिखित स्क्रिप्ट में 10-सेकंड पिंग कमांड का समय होगा, जिसमें ऋणात्मक संख्या में बंधे बिना एक दिन की सीमा पार करने की क्षमता होगी। मामूली वृद्धि से यह कई दिन की सीमाओं को पार करने की अनुमति देगा।

@echo off 
setlocal enableextensions enabledelayedexpansion 
set starttime=%time% 
ping -n 11 127.0.0.1 >nul: 2>nul: 
set endtime=%time% 

set /a hrs=%endtime:~0,2% 
set /a hrs=%hrs%-%starttime:~0,2% 

set /a mins=%endtime:~3,2% 
set /a mins=%mins%-%starttime:~3,2% 

set /a secs=%endtime:~6,2% 
set /a secs=%secs%-%starttime:~6,2% 

if %secs% lss 0 (
    set /a secs=!secs!+60 
    set /a mins=!mins!-1 
) 
if %mins% lss 0 (
    set /a mins=!mins!+60 
    set /a hrs=!hrs!-1 
) 
if %hrs% lss 0 (
    set /a hrs=!hrs!+24 
) 
set /a tot=%secs%+%mins%*60+%hrs%*3600 

echo End  = %endtime% 
echo Start = %starttime% 
echo Hours = %hrs% 
echo Minutes = %mins% 
echo Seconds = %secs% 
echo Total = %tot% 

endlocal 
4

यह एक प्रकार का स्पर्शपूर्ण है, लेकिन यह आपकी मदद कर सकता है।

माइक्रोसॉफ्ट के पास timeit.exe प्रोग्राम है जो यूनिक्स 'टाइम' कमांड के एक उन्नत संस्करण की तरह कम या ज्यादा काम करता है। यह Windows Server 2003 Resource Kit में आता है, और यह हर बार बदल गया है जो मैं कुछ सुझाव देना चाहता हूं जैसा आप सुझाव दे रहे हैं।

यह एक लायक हो सकता है।

35

मूल बैच फ़ाइल के बारे में दो चीजें बाहर निकलती हैं। लेकिन लंबे समय तक न तो मदद करने जा रहा है।

  1. जो भी आपकी बेंचमार्क विधि, आपरेशन से पहले शुरू करने का समय कब्जा करने के लिए सुनिश्चित हो, और ऑपरेशन के बाद अंत समय । आपका नमूना ऐसा नहीं करता है।

  2. %time% "12: 34: 56.78" जैसे कुछ का मूल्यांकन करता है, और SET /A कमांड उनको घटा नहीं सकता है। आपको एक कमांड की आवश्यकता है जो एक साधारण स्केलर टाइम स्टैम्प का उत्पादन करे।

मैं कहना है कि यह नहीं किया जा सकता जा रहा था, लेकिन बैच भाषा एक बहुत अधिक शक्तिशाली की तुलना में यह करने के लिए ऋण दिया जाता है, तो यहाँ है TIMER.BAT का एक सरल कार्यान्वयन है। रिकॉर्ड के लिए, पैक्स मुझे स्ट्रिंग बंटवारे दिखा एक जवाब से हरा दिया, जबकि मैं लगभग नगण्य था, और जोहानिस Rossel मापा क्षेत्र के बाहर गणित चलती सुझाव:

@echo off 
setlocal 

rem Remeber start time. Note that we don't look at the date, so this 
rem calculation won't work right if the program run spans local midnight. 
set t0=%time: =0% 

rem do something here.... but probably with more care about quoting. 
rem specifically, odd things will happen if any arguments contain 
rem precent signs or carets and there may be no way to prevent it. 
%* 

rem Capture the end time before doing anything else 
set t=%time: =0% 

rem make t0 into a scaler in 100ths of a second, being careful not 
rem to let SET/A misinterpret 08 and 09 as octal 
set /a h=1%t0:~0,2%-100 
set /a m=1%t0:~3,2%-100 
set /a s=1%t0:~6,2%-100 
set /a c=1%t0:~9,2%-100 
set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c% 

rem make t into a scaler in 100ths of a second 
set /a h=1%t:~0,2%-100 
set /a m=1%t:~3,2%-100 
set /a s=1%t:~6,2%-100 
set /a c=1%t:~9,2%-100 
set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c% 

rem runtime in 100ths is now just end - start 
set /a runtime = %endtime% - %starttime% 
set runtime = %s%.%c% 

echo Started at %t0% 
echo Ran for %runtime%0 ms 

आप गणित को सरल बनाने और एक छोटे से अधिक हो सकता है दूसरे भाग के 100 वें के साथ परेशान न होकर इसकी समग्र सटीकता के बारे में ईमानदार।यहाँ यह कार्रवाई में है, यह सोचते हैं कि आप एक नींद आदेश या कुछ अन्य समय नुक़सान है:

C:> TIMER SLEEP 3 
Script took 3000 ms to complete 
C:> 

संपादित करें: के रूप में एक टिप्पणी में सुझाव दिया मैं कोड और इसके विवरण को संशोधित किया।

मुझे लगता है कि जब एनटी टीम ने COMMAND.COM को CMD.EXE के साथ बदल दिया, तो उन्होंने सोचा कि वे इसे बहुत अलग बनाने से दूर नहीं होंगे। लेकिन असल में, यह लगभग पूरी तरह से नई भाषा है। एक्सटेंशन सक्षम होने पर पुराने पसंदीदा आदेशों में से कई में नई सुविधाएं हैं।

उनमें से एक SETLOCAL है जो कॉलर के पर्यावरण को संशोधित करने से चर को रोकता है। एक और SET /A है जो आपको अंकगणित की एक उल्लेखनीय राशि देता है। मैंने जिस सिद्धांत की चाल का उपयोग किया है वह नया सबस्ट्रिंग निष्कर्षण वाक्यविन्यास है जहां %t:~3,2% का मतलब है कि t नामक चर के मान में ऑफ़सेट 3 से शुरू होने वाले दो वर्ण हैं।

असली शॉकर के लिए, सेट के पूर्ण विवरण पर एक नज़र डालें (एक संकेत पर SET /? आज़माएं) और यदि यह आपको डराता नहीं है, तो FOR /? पर ध्यान दें और ध्यान दें कि यह फ़ाइलों से टेक्स्ट को पार्स कर सकता है ...

संपादित करें 2: समय 08 या 09 टिप्पणी में फ्रेंकी द्वारा रिपोर्ट युक्त क्षेत्रों के फिक्स्ड गलत हैंडलिंग। कुछ चीजें tweaked, और कुछ टिप्पणियां जोड़ा।

ध्यान दें कि यहां एक चमकदार निगरानी है कि शायद मैं ठीक नहीं कर रहा हूं। यदि काम समाप्त होने से अलग दिन पर शुरू होता है तो यह काम नहीं करेगा। यही है, यह दिन के समय से संबंधित कुछ गणित करेगा और एक अंतर की रिपोर्ट करेगा, लेकिन अंतर का मतलब अधिक नहीं होगा।

कम से कम इस मामले के बारे में चेतावनी देने के लिए इसे ठीक करना आसान है। सही काम करने के लिए इसे ठीक करना कठिन है।

संपादित करें 3: फिक्स्ड त्रुटि जहां% h% एकल अंकों के घंटों के लिए ठीक से सेट नहीं है। यह% 9% लौटने के कारण "9: 01: 23.45" है। अंतरिक्ष पर ध्यान दें। % समय का उपयोग करना: = 0% अंतरिक्ष को एक अग्रणी शून्य के साथ बदल देता है और% h% सही ढंग से सेट किया जाएगा। यह त्रुटि केवल तभी हुई जब एक स्क्रिप्ट एक एकल अंक से अगले तक चला।

+0

+1 भी देखें ... क्या आप समझा सकते हैं सेट/एक व्यवसाय (वर्तमान में लिनक्स पर बूट किया गया) – ojblass

+0

सेट/ए बैच में अंकगणित करता है। वह यहाँ क्या करता है सब कुछ एक दूसरे के 1/100 तक कम कर रहा है। बाद में आप उन्हें केवल घटा सकते हैं क्योंकि वे दोनों ही संख्याएं हैं। – Joey

+0

हो सकता है कि आप अपने आदेश को निष्पादित करने के बाद सभी गणित करना चाहें, हालांकि ... cmd में गणित बिल्कुल तेज़ नहीं है, इसलिए बस अपना आदेश समाप्त होने के बाद स्टार्ट टाइम और इसके साथ चारों ओर बेवकूफ़ों को स्टोर करें ताकि इसे गिना नहीं जा सके आदेश का समय। डुनो क्या इससे कोई फर्क पड़ता है, जाहिर है – Joey

2

इस स्क्रिप्ट को देखें जो डब्लूएमआई के माध्यम से समय पुनर्प्राप्त करेगा ताकि यह क्षेत्रीय सेटिंग स्वतंत्र हो।

@echo off 
:::::::::::::::::::::::::::::::::::::::::: 
::  TimeDiff v1.00 by LEVENTE ROG       :: 
::       www.thesysadminhimself.com     :: 
:::::::::::::::::::::::::::::::::::::::::: 
  
::[ EULA ]::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
::  Feel free to use this script. The code can be redistributed  :: 
::  and edited, but please keep the credits.                     :: 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
  
::[ CHANGELOG ]:::::::::::::: 
::  v1.00 - First Version  :: 
::::::::::::::::::::::::::::: 
  
  
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Milisecond=%time:~9,2% 
 set Day=%%A 
 set Hour=%%B 
 set Minute=%%C 
 set Second=%%D 
) 
set /a Start=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond% 
  
:: 
:: 
:: PUT COMMANDS HERE 
ping www.thesysadminhimself.com 
:: 
:: 
  
FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
 set Day=%%A 
 set Hour=%%B 
 set Minute=%%C 
 set Second=%%D 
) 
set Milisecond=%time:~9,2% 
set /a End=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond% 
set /a Diff=%End%-%Start% 
set /a DiffMS=%Diff%%%100 
set /a Diff=(%Diff%-%DiffMS%)/100 
set /a DiffSec=%Diff%%%60 
set /a Diff=(%Diff%-%Diff%%%60)/60 
set /a DiffMin=%Diff%%%60 
set /a Diff=(%Diff%-%Diff%%%60)/60 
set /a DiffHrs=%Diff% 
  
:: format with leading zeroes 
if %DiffMS% LSS 10 set DiffMS=0%DiffMS!% 
if %DiffSec% LSS 10 set DiffMS=0%DiffSec% 
if %DiffMin% LSS 10 set DiffMS=0%DiffMin% 
if %DiffHrs% LSS 10 set DiffMS=0%DiffHrs% 
  
echo %DiffHrs%:%DiffMin%:%DiffSec%.%DiffMS% 
+0

+1 अच्छा समाधान है, लेकिन यह धीमा है, प्रत्येक टाइमस्टैम्प की आवश्यकता ~ 100ms-200ms (मेरे पीसी 2.4GHz कोर 2 डुओ पर) – jeb

3

उत्कृष्ट छोटी दिनचर्या। हालांकि, यदि गणना दो दिनों में फैली हुई है, तो गणना गलत है। परिणाम 24 घंटों (8640000 सेंटीसेकंड) से घटाए जाने की आवश्यकता है।

प्रासंगिक लाइन में डुप्लिकेट 'सेट' कमांड में से एक को भी हटा दें।

ध्यान दें कि क्षेत्रीय सेटिंग्स टाइम फ़ंक्शन के प्रारूप को प्रभावित करती हैं, दशमलव को अल्पविराम के बजाय यूके में पूर्णता है।

लाइनों

रेम हम समय मापा जाता हो सकता है inbetween दिनों

if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME% 

जरूरत के

रेम बदलते हम दिन भर में समय मापा जाता हो सकता है

if %ENDTIME% LSS %STARTTIME% set /A DURATION=8640000 - (%STARTTIME% - %ENDTIME%) 
संबंधित मुद्दे