2010-11-30 15 views
16

क्या कोई मुझे विंडोज बैच फ़ाइल में टाइमर जोड़ने का तरीका बता सकता है? मुझे उस समय को ट्रैक करने की ज़रूरत है जब मेरा बैच शुरू से चलता है।विंडोज बैच फ़ाइल में टाइमर

+0

को डॉस के किस संस्करण का उपयोग कर रहे हैं? – TZHX

+0

संस्करण 5.2.379 – JVIDIN

उत्तर

4

जहां तक ​​मुझे पता है कि कोई स्पष्ट 'टाइमर' कमांड नहीं है जिसे आप बैच फ़ाइलों में उपयोग कर सकते हैं - हालांकि एक काफी सरल समाधान है। बैच फ़ाइल के अंत में आपके बैच फ़ाइल के शीर्ष पर वर्तमान समय (प्रारंभ समय) रिकॉर्ड करें वर्तमान समय (समाप्ति समय) रिकॉर्ड करें और फिर दोनों की तुलना करें। कुछ इस तरह यह करना चाहिए (यह ज्यादा जटिल प्रतीत होता है, लेकिन यह समय की सबसे quirks संभालती):

:: Store start time 
set StartTIME=%TIME% 
set H=%StartTIME:~0,2% 
if "%H:~0,1%"==" " set H=%H:~1,1% 
if "%H:~0,1%"=="0" set H=%H:~1,1% 
set M=%StartTIME:~3,2% 
if "%M:~0,1%"=="0" set M=%M:~1,1% 
set S=%StartTIME:~6,2% 
if "%S:~0,1%"=="0" set S=%S:~1,1% 
set U=%StartTIME:~9,2% 
if "%U:~0,1%"=="0" set U=%U:~1,1% 
) 
set /a Start100S=%H%*360000+%M%*6000+%S%*100+%U% 

:: 
:: Add your script functionality here 
:: 

:: Get the end time 
set StopTIME=%TIME% 
set H=%StopTIME:~0,2% 
if "%H:~0,1%"==" " set H=%H:~1,1% 
if "%H:~0,1%"=="0" set H=%H:~1,1% 
set M=%StopTIME:~3,2% 
if "%M:~0,1%"=="0" set M=%M:~1,1% 
set S=%StopTIME:~6,2% 
if "%S:~0,1%"=="0" set S=%S:~1,1% 
set U=%StopTIME:~9,2% 
if "%U:~0,1%"=="0" set U=%U:~1,1% 
) 

set /a Stop100S=%H%*360000+%M%*6000+%S%*100+%U% 

:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs 
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000 
set /a TookTime=%Stop100S%-%Start100S% 

echo Started: %StartTime% 
echo Stopped: %StopTime% 
echo Elapsed: %TookTime:~0,-2%.%TookTime:~-2% seconds 

वैकल्पिक रूप से # 1: Windows सर्वर 2k3 संसाधन किट timeit.exe भी शामिल है। आप अपनी स्क्रिप्ट के लिए विभिन्न प्रदर्शन आंकड़े प्रदर्शित करने के लिए इसका उपयोग कर सकते हैं।

वैकल्पिक रूप से # 2: आप स्क्रिप्ट ऊपर तैनात तुलना में बहुत सरल जाकर यह कर सकता है:

echo %time% 
:: 
:: Your script functionality 
:: 
echo %time% 

बहरहाल, यह आप निष्पादन समय सेकंड में नहीं देंगे।

15

बीता हुआ समय की गणना करने के कोड पुनर्स्थापन:, गणना में

  • कम कोड, .1 सेकंड से कम समय बीता हुआ समय के लिए
  • प्रदान की गद्दी
  • लेबल का उपयोग यह बुला कई बार अनुमति देने के लिए, और टाइमर कोड समूह करने के लिए।

पुन: प्रयोज्य कोड:

:StartTimer 
:: Store start time 
set StartTIME=%TIME% 
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StartTIME: =0%`) do set /a Start100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100 
goto :EOF 

:StopTimer 
:: Get the end time 
set StopTIME=%TIME% 
for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo %StopTIME: =0%`) do set /a Stop100S=1%%f*360000+1%%g*6000+1%%h*100+1%%i-36610100 
:: Test midnight rollover. If so, add 1 day=8640000 1/100ths secs 
if %Stop100S% LSS %Start100S% set /a Stop100S+=8640000 
set /a TookTime=%Stop100S%-%Start100S% 
set TookTimePadded=0%TookTime% 
goto :EOF 

:DisplayTimerResult 
:: Show timer start/stop/delta 
echo Started: %StartTime% 
echo Stopped: %StopTime% 
echo Elapsed: %TookTime:~0,-2%.%TookTimePadded:~-2% seconds 
goto :EOF 

कॉलिंग कोड:

call :StartTimer 
:: 
:: Add your script functionality here 
:: 
call :StopTimer 
call :DisplayTimerResult 
pause 

call :StartTimer 
:: 
:: Add more script functionality here 
:: 
call :StopTimer 
call :DisplayTimerResult 
goto :EOF 

नोट "1" -prefix अष्टाधारी मूल्यों के रूप में शून्य गद्देदार मूल्यों की व्याख्या त्रुटियों से बचने के (08 और 09) , और उचित स्थिर के साथ सुधार।

for /f "usebackq tokens=1-4 delims=:., " %%f in (`echo.%StartTIME%`) do set TempTIME=%%f %%g %%h %%i 
for /f "usebackq tokens=1-4" %%f in (`echo %TempTIME: 0= %`) do set /a Start100S=%%f*360000+%%g*6000+%%h*100+%%i 
2

आपको यह एक (छोटा ..)

@echo off 
:loop 
set TA=%time% & echo %time%--A 

echo Put Your Code Here... 

set TB=%time% & echo %time%--B 

call:Timediff %TA% %TB% Tab 
for /f "tokens=1-3 delims=:" %%a in ("%TAB%")do echo Time difference: %%a hours %%b minutes and %%c seconds 
pause 
goto:loop 

:: /* ---------- Timediff --------------- 
:Timediff [%t1%] [%t2%] [par|0] 
for %%a in (+%1 +%2 +%3)do if "%%a"=="+" echo No Parameters!!&exit/b 
setlocal enabledelayedexpansion 
:timediff_1 
set P2=%~1&set "P2=!P2::=!" 
set/a P2=%P2:.=%-4000*(%P2:~,4%+60*%P2:~,2%) 
if not "%3"=="" set P1=!P2!&shift&goto:timediff_1 
if !P2! geq !P1! (set/a df=!P2!-!P1!) else set/a df=!P2!-!P1!+8640000 
set/a h=df/360000,m=df%%360000/6000,s=df%%6000/100,pt=df%%100 
if %pt% leq 9 set pt=0%pt% 
endlocal&if %2.==0. (echo\%h%:%m%:%s%.%pt%) else set %2=%h%:%m%:%s%.%pt%&goto:eof 
:: ------------- Timediff ------------- */ 
+0

का उपयोग कर रहा हूँ यह काम नहीं किया! –

1
कोशिश कर सकते हैं: इस कोर गणना को समझना मुश्किल हो सकता है के रूप में, एक पंक्ति के लिए एक विकल्प for बयान निम्नलिखित की तरह कुछ होगा

संरचना इस तरह अपने कार्यक्रम:

@echo off 
setlocal enabledelyedexpansion 

set T[1]=%time% 

:: 
:: Your program goes here... 
:: 

set T[2]=%time% 
call TIMER 

यहाँ TIMER.BAT कार्यक्रम के लिए कोड है। इसे अपने पथ में कहीं अलग फ़ाइल के रूप में सहेजें।

for /l %%t in (1,1,2) do for /f "tokens=1-4 delims=:." %%a in ("!T[%%t]!") do (
set "T[%%t]=!T[%%t]: =0!" 
set "h[%%t]=%%a" & if "!h[%%t]:~0,1!"=="0" set "h[%%t]=!h[%%t]:~1!" 
set "m[%%t]=%%b" & if "!m[%%t]:~0,1!"=="0" set "m[%%t]=!m[%%t]:~1!" 
set "s[%%t]=%%c" & if "!s[%%t]:~0,1!"=="0" set "s[%%t]=!s[%%t]:~1!" 
set "c[%%t]=%%d" & if "!c[%%t]:~0,1!"=="0" set "c[%%t]=!c[%%t]:~1!" 
set /a T[%%t]=!h[%%t]!*360000+!m[%%t]!*6000+!s[%%t]!*100+!c[%%t]! 
) 

set /a c=!T[2]!-!T[1]! 
set /a h=!c!/360000 & set /a c%%=360000 & if !h! lss 10 set "h= !h!" 
set /a m=!c!/6000 & set /a c%%=6000 & if !m! lss 10 set "m=0!m!" 
set /a s=!c!/100 & set /a c%%=100 & if !s! lss 10 set "s=0!s!" 
echo !h!:!m!:!s!.!c! 
5

सेकंड में विलुप्त समय के साथ एक न्यूनतम संस्करण।

@set /A _tic=%time:~0,2%*3600^ 
      +%time:~3,1%*10*60^ 
      +%time:~4,1%*60^ 
      +%time:~6,1%*10^ 
      +%time:~7,1% >nul 

:: actual script 

@set /A _toc=%time:~0,2%*3600^ 
      +%time:~3,1%*10*60^ 
      +%time:~4,1%*60^ 
      +%time:~6,1%*10^ 
      +%time:~7,1% >nul 

@set /A _elapsed=%_toc%-%_tic 
@echo %_elapsed% seconds. 
+0

लेकिन मेरे पास डेढ़ घंटे की स्क्रिप्ट है। सेकेंड के बजाय मिनटों के लिए यह कैसे किया जाएगा? क्षमा करें अगर आपके लिए बहुत आसान लगता है! –

+1

धन्यवाद @ मिगोनज़लवार, यह वही था जो मुझे चाहिए था। उत्सुकता के लिए, आप मिनटों और सेकंड के लिए एक समय में दो अंक पुनर्प्राप्त नहीं कर सकते हैं क्योंकि एक अग्रणी 0 संख्या को ऑक्टल के रूप में व्याख्या करने का कारण बनता है। यह घंटों तक काम करता है क्योंकि एक अग्रणी स्थान है, 0 नहीं। और आपको "> nul" से पहले स्थान की आवश्यकता है क्योंकि (उदाहरण के लिए) "2> nul" का अर्थ है stderr को रीडायरेक्ट करना। (ओह, और पीछे की ओर^प्रतीकों ने नई लाइन से बच निकला।) – yoyo

2

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

@echo off 
cls 
set /a time=5 
:hi 
cls 
echo Time:%time% 
ping localhost -n 2 >nul 
set /a time=%time%-1 
if %time%==0 (
goto timeup 
)else goto :hi 
:timeup 
cls 
echo Time is up! 
pause 

भी समय इस टाइमर पर शुरू होता है को बदलने के लिए, बस बदलने set /a time=5set /a time=(whatever time you want to start at)

+0

धन्यवाद ............... यह मेरी समस्या को हल करता है –

संबंधित मुद्दे