답변:
Windows 2003을 사용하는 경우 (Windows Server 2008 이상은 지원되지 않음) 자세한 실행 통계를 표시하는 timeit.exe가 포함 된 Windows Server 2003 Resource Kit를 사용할 수 있습니다. 다음은 "timeit-?"명령 타이밍의 예입니다.
C:\>timeit timeit -?
Invalid switch -?
Usage: TIMEIT [-f filename] [-a] [-c] [-i] [-d] [-s] [-t] [-k keyname | -r keyname] [-m mask] [commandline...]
where: -f specifies the name of the database file where TIMEIT
keeps a history of previous timings. Default is .\timeit.dat
-k specifies the keyname to use for this timing run
-r specifies the keyname to remove from the database. If
keyname is followed by a comma and a number then it will
remove the slowest (positive number) or fastest (negative)
times for that keyname.
-a specifies that timeit should display average of all timings
for the specified key.
-i specifies to ignore non-zero return codes from program
-d specifies to show detail for average
-s specifies to suppress system wide counters
-t specifies to tabular output
-c specifies to force a resort of the data base
-m specifies the processor affinity mask
Version Number: Windows NT 5.2 (Build 3790)
Exit Time: 7:38 am, Wednesday, April 15 2009
Elapsed Time: 0:00:00.000
Process Time: 0:00:00.015
System Calls: 731
Context Switches: 299
Page Faults: 515
Bytes Read: 0
Bytes Written: 0
Bytes Other: 298
Windows 2003 Resource Kit에서 TimeIt을 얻을 수 있습니다. 여기에서 다운로드 하십시오 .
또는 Windows PowerShell에는 Bash의 "시간"명령과 유사한 기본 제공 명령이 있습니다. "측정 명령"이라고합니다. PowerShell이 실행되는 시스템에 PowerShell이 설치되어 있는지 확인해야합니다.
입력 예 :
Measure-Command {echo hi}
출력 예 :
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 0
Ticks : 1318
TotalDays : 1.52546296296296E-09
TotalHours : 3.66111111111111E-08
TotalMinutes : 2.19666666666667E-06
TotalSeconds : 0.0001318
TotalMilliseconds : 0.1318
.exe
현재 디렉토리에서를 벤치마킹하는 경우 다음을 사용하십시오 Measure-Command { .\your.exe }
. pwd
명시 적으로 지시 하지 않으면 PowerShell은 분명히 실행되지 않습니다 .
<stdout>
네가 원한다면
다음 스크립트를 새 배치 파일 (예 : timecmd.bat )에 복사하십시오 .
@echo off
@setlocal
set start=%time%
:: Runs your command
cmd /c %*
set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)
용법
timecmd.bat를 경로의 디렉토리에 넣으면 다음과 같이 어디에서나 호출 할 수 있습니다.
timecmd [your command]
예 :
C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18
출력 리디렉션을 수행하려면 다음과 같이 명령을 인용하십시오.
timecmd "dir c:\windows /s > nul"
자정 전후에 실행되는 명령을 처리해야하지만 명령이 24 시간 이상 실행되면 출력이 잘못됩니다.
timecmd pause
하며, 항상 1.00 초, 2.00 초, 4.00 초, 심지어 0.00 초가됩니다! Windows 7.
delims=:.
하면 delims=:.,
"보드 전체"에서 작동합니다.
set start=10:10:10.10
set end=10:11:10.09
출력 : command took 0:1:-1.99 (59.99s total)
"lss 0"비교를 수행하는 4 행의 순서를 반대로 바꾸면 캐리가 낮은 자리수에서 높은 자리수 자리까지 올바로 진행됩니다. 그런 다음 출력됩니다 : command took 0:0:59.99 (59.99s total)
Hehe, 가장 간단한 해결책은 다음과 같습니다.
echo %time%
YourApp.exe
echo %time%
이것은 모든 Windows에서 기본적으로 작동합니다.
콘솔 출력을 사용하는 응용 프로그램의 경우 시작 시간을 임시 변수에 저장하는 것이 편리 할 수 있습니다.
set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time%
(죄송합니다, 댓글에 줄 바꿈이 없었습니다)
set
수학을 할 수 있습니다 . ;-)
아 잠깐만, 당신은 이미 아래에서 그렇게 했어.
from PowerShell 사용에 대한 Casey.K의 답변 이 약간 확장 Measure-Command
되었습니다 .
다음과 같이 표준 명령 프롬프트에서 PowerShell을 호출 할 수 있습니다.
powershell -Command "Measure-Command {echo hi}"
표준 출력을 사용하지만 | Out-Default
PowerShell에서 다음과 같이 추가 하면이를 방지 할 수 있습니다 .
Measure-Command {echo hi | Out-Default}
또는 명령 프롬프트에서 :
powershell -Command "Measure-Command {echo hi | Out-Default}"
물론 스크립트 파일 *.ps1
또는 로 래핑 할 수도 *.bat
있습니다.
measureTime.bat "c:\program files\some dir\program.exe"
Windows Server 2008 R2에서 사용하는 하나의 라이너는 다음과 같습니다.
cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"
너무 오래로 mycommand 따옴표를 필요로하지 않는다 (이 cmd를의 인용 처리와 나사). 이 /v:on
명령은 명령 실행시 두 개의 서로 다른 TIME 값을 한 번이 아니라 독립적으로 평가할 수 있도록합니다.
^
cmd를 (같은 ^"
)
cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!
.
cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
명령 창이 열려 있고 수동으로 명령을 호출하는 경우 각 프롬프트에 타임 스탬프를 표시 할 수 있습니다 (예 :
prompt $d $t $_$P$G
그것은 당신에게 다음과 같은 것을 제공합니다 :
23.03.2009 15:45:50,77
C:\>
명령을 실행하는 작은 배치 스크립트가있는 경우 각 명령 앞에 빈 줄이 있어야합니다 (예 :
(빈 줄)
myCommand.exe
(다음 빈 줄)
myCommand2.exe
프롬프트의 시간 정보로 각 명령의 실행 시간을 계산할 수 있습니다. 추가 분석을 위해 출력을 텍스트 파일로 파이프하는 것이 가장 좋습니다.
MyBatchFile.bat > output.txt
다른 사람들은 프리웨어 및 PowerShell과 같은 설치를 권장하므로 Cygwin 을 설치 하여 시간 과 같은 많은 기본 Unix 명령에 액세스 할 수 있습니다 .
abe@abe-PC:~$ time sleep 5
real 0m5.012s
user 0m0.000s
sys 0m0.000s
Cygwin이 얼마나 많은 오버 헤드를 추가하는지 확실하지 않습니다.
유닉스의 일부 기능만큼 우아하지는 않지만 다음과 같은 cmd 파일을 만듭니다.
@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T
시작 및 중지 시간이 다음과 같이 표시됩니다.
The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:
time
하는 /t
옵션이 있습니다. 그러나 그렇게하면 시간과 분만 표시되므로 일부 용도로는 충분하지 않을 수 있습니다. (이 질문에 대한 John Snow의 답변을 참조하십시오.)
time /T
프로세스가 몇 분 동안 실행되는 경우에만 사용할 수 있습니다! time < nul
더 추악하지만 더 정확합니다.
echo %time%
와 동일한 형식 및 정밀도를 제공하는 time < nul
,하지만 당신은 피 Enter the new time:
... 출력
wmic os get LocalDateTime
"GS Timer"라는 프리웨어를 사용합니다.
다음과 같이 배치 파일을 만드십시오.
timer
yourapp.exe
timer /s
시간이 필요한 경우 timer / s의 출력을 .txt 파일로 파이프하십시오.
여기에서 얻을 수 있습니다 : Gammadyne의 무료 DOS 유틸리티
해상도는 0.1 초입니다.
Windows XP를 사용하고 있으며 어떤 이유로 timeit.exe가 작동하지 않습니다. 다른 대안을 찾았습니다-PTIME. 이것은 매우 잘 작동합니다.
http://www.pc-tools.net/win32/ptime/
예 -
C:\> ptime
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
Syntax: ptime command [arguments ...]
ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.
C:\> ptime cd
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
=== cd ===
C:\
Execution time: 0.015 s
24 시간 이상 지속되지 않는 한 ...
@echo off
set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)
:TimeThis
ping localhost
set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)
set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%
echo.
echo Took: %timetaken% sec.
여기에
사용 예 :
타임 아웃 1 | TimeIt.cmd
Execution took ~969 milliseconds.
메모장 ++ 와 같은 편집기에 복사하여 붙여 넣은 다음 TimeIt.cmd 로 저장하십시오 .
:: --- TimeIt.cmd ----
@echo off
setlocal enabledelayedexpansion
call :ShowHelp
:: Set pipeline initialization time
set t1=%time%
:: Wait for stdin
more
:: Set time at which stdin was ready
set t2=!time!
:: Calculate difference
Call :GetMSeconds Tms1 t1
Call :GetMSeconds Tms2 t2
set /a deltaMSecs=%Tms2%-%Tms1%
echo Execution took ~ %deltaMSecs% milliseconds.
endlocal
goto :eof
:GetMSeconds
Call :Parse TimeAsArgs %2
Call :CalcMSeconds %1 %TimeAsArgs%
goto :eof
:CalcMSeconds
set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof
:Parse
:: Mask time like " 0:23:29,12"
set %1=!%2: 0=0!
:: Replace time separators with " "
set %1=!%1::= !
set %1=!%1:.= !
set %1=!%1:,= !
:: Delete leading zero - so it'll not parsed as octal later
set %1=!%1: 0= !
goto :eof
:ShowHelp
echo %~n0 V1.0 [Dez 2015]
echo.
echo Usage: ^<Command^> ^| %~nx0
echo.
echo Wait for pipe getting ready... :)
echo (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof
측정 시간의 대안은 단순히 "Get-Date"입니다. 전달 출력 등으로 번거롭지 않습니다.
$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start
산출:
Days : 0
Hours : 0
Minutes : 0
Seconds : 1
Milliseconds : 506
Ticks : 15060003
TotalDays : 1.74305590277778E-05
TotalHours : 0.000418333416666667
TotalMinutes : 0.025100005
TotalSeconds : 1.5060003
TotalMilliseconds : 1506.0003
이것은 지연 확장 을 피하는 하나의 라이너로 특정 명령을 방해 할 수 있습니다.
cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "
출력은 다음과 같습니다.
14:30:27.58$ ... 14:32:43.17$ rem/
장기의 경우 시험 대체 $T
에 의해 $D, $T
그리고 %TIME%
으로 %DATE%, %TIME%
날짜를 포함 할 수 있습니다.
의 내부 사용하려면 배치 파일을 대체 %Z
하여 %%Z
.
여기이고 개선 한 라이너 (않고 지연 확대 도)
cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"
출력은 다음과 유사합니다.
2015/09/01, 14:30:27.58$ rem/ ... 2015/09/01, 14:32:43.17$ prompt
이 방법에는 cmd
결과에 새로운 인스턴스를 만드는 과정 이나 prompt
명령 이 포함되지 않습니다 .
사용중인 Windows 버전에 따라 실행 bash
하면 Bash 모드가됩니다. 이를 통해 PowerShell에서 직접 사용할 수없는 time
명령 (예 : 명령)을 사용할 수 있습니다 . 명령 타이밍은 이제 실행하는 것만 큼 쉽습니다.
# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>
참고 : Bash 모드에서 실행하면 Bash 모드에서 쉽게 종료하고 주류 셸로 돌아갈 수 있습니다
exit
.
Measure-Command
때로는 원하지 않는 통계를 생성하는 다른 방법 (예 :)을 시도한 후 완벽하게 작동했습니다 (Windows 10) . 이것이 당신에게도 효과가 있기를 바랍니다.
다른 사람이이 질문에 대한 답을 찾고자하는 경우,라는 Windows API 함수가 GetProcessTimes()
있습니다. 명령을 시작하고 호출하고 프로세스 시간을 반환하는 작은 C 프로그램을 작성하는 것은 너무 많은 일처럼 보이지 않습니다.
이것은 누가 복음 샘슨의 좋은에게 의견 / 편집입니다 timecmd.bat
및 응답
어떤 이유로 든 이것은 몇 초 만에 출력을 제공합니다 ... 나에게는 쓸모가 없습니다. 나는 timecmd pause를 실행하고 항상 1.00 초, 2.00 초, 4.00 초, 심지어 0.00 초를 초래한다는 것을 의미합니다! Windows 7. – Camilo Martin 9 월 25 일 '13시 16:00 "
일부 구성에서는 구분자가 다를 수 있습니다. 다음과 같은 변화는 대부분의 서구 국가들에 적용됩니다.
set options="tokens=1-4 delims=:,." (added comma)
그만큼 %time%
밀리 초 ','것을 추가 한 후 내 시스템에서 작동
(* ipv6 ip 및 브라우저 지문과 결합 된 동일한 게스트 이메일을 비밀번호없이 고유하게 식별하기에 충분해야 항상 사이트에서 익명 코멘트를 허용하지 않고 신원을 잘 추적하지 않기 때문에)
여기 내 방법, 변환 및 ms가 없습니다. 인코딩 시간을 결정하는 데 유용합니다 (24 시간으로 제한됨).
@echo off
:start
REM Start time storage
set ST=%time%
echo Process started at %ST%
echo.
echo.
REM Your commands
REM Your commands
REM Your commands
:end
REM Start Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%ST%") do set /a h1=%%a & set /a m1=%%b & set /a s1=%%c
REM End Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%TIME%") do set /a h2=%%a & set /a m2=%%b & set /a s2=%%c
REM Difference
set /a h3=%h2%-%h1% & set /a m3=%m2%-%m1% & set /a s3=%s2%-%s1%
REM Time Adjustment
if %h3% LSS 0 set /a h3=%h3%+24
if %m3% LSS 0 set /a m3=%m3%+60 & set /a h3=%h3%-1
if %s3% LSS 0 set /a s3=%s3%+60 & set /a m3=%m3%-1
echo Start : %ST%
echo End : %time%
echo.
echo Total : %h3%:%m3%:%s3%
echo.
pause
@echo off & setlocal
set start=%time%
REM Do stuff to be timed here.
REM Alternatively, uncomment the line below to be able to
REM pass in the command to be timed when running this script.
REM cmd /c %*
set end=%time%
REM Calculate time taken in seconds, to the hundredth of a second.
REM Assumes start time and end time will be on the same day.
set options="tokens=1-4 delims=:."
for /f %options% %%a in ("%start%") do (
set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a start_hs=100%%d %% 100
)
for /f %options% %%a in ("%end%") do (
set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a end_hs=100%%d %% 100
)
set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%
if %hs% lss 0 (
set /a s=%s%-1
set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%
echo.
echo Time taken: %s%.%hs% secs
echo.
다음 스크립트는 "cmd.exe"만 사용하고 파이프 라인이 생성 된 시점부터 스크립트 이전 프로세스가 종료되는 시점까지의 시간 (밀리 초)을 출력합니다. 즉, 명령을 입력하고 스크립트로 파이프하십시오. 예 : "timeout 3 | runtime.cmd"는 "2990"과 같은 형식이어야합니다. 런타임 출력과 stdin 출력이 모두 필요한 경우 파이프 앞에 stdin을 리디렉션하십시오 (예 : "dir / s 1> temp.txt | runtime.cmd"는 "dir"명령의 출력을 "temp.txt"로 덤프 함) 콘솔에 런타임을 인쇄합니다.
:: --- runtime.cmd ----
@echo off
setlocal enabledelayedexpansion
:: find target for recursive calls
if not "%1"=="" (
shift /1
goto :%1
exit /b
)
:: set pipeline initialization time
set t1=%time%
:: wait for stdin
more > nul
:: set time at which stdin was ready
set t2=!time!
::parse t1
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !
:: parse t2
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !
:: calc difference
pushd %~dp0
for /f %%i in ('%0 calc !t1!') do for /f %%j in ('%0 calc !t2!') do (
set /a t=%%j-%%i
echo !t!
)
popd
exit /b
goto :eof
:calc
set /a t=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4)
echo !t!
goto :eof
endlocal
드리블 리오 의 대답은 조금 더 짧게 만들 수 있습니다 (많은 읽을 수는 없지만)
@echo off
:: Calculate the start timestamp
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _started=_hours*60*60*100+_min*60*100+_sec*100+_cs
:: yourCommandHere
:: Calculate the difference in cSeconds
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _duration=_hours*60*60*100+_min*60*100+_sec*100+_cs-_started
:: Populate variables for rendering (100+ needed for padding)
set /a _hours=_duration/60/60/100,_min=100+_duration/60/100%%60,_sec=100+(_duration/100%%60%%60),_cs=100+_duration%%100
echo Done at: %_time% took : %_hours%:%_min:~-2%:%_sec:~-2%.%_cs:~-2%
::prints something like:
::Done at: 12:37:53,70 took: 0:02:03.55
Luke Sampson 의 말 에 따르면 이 버전은 8 진수로 안전하지만 24 시간 내에 작업을 완료해야합니다.
set _time=%time: =0%
한 자리 시간 문제를 해결-두 곳에서 교체하십시오.
프로그램이있는 디렉토리에서을 입력 notepad mytimer.bat
하고 '예'를 클릭하여 새 파일을 작성하십시오.
아래 코드를 붙여 YourApp.exe
넣어 프로그램으로 바꾼 다음 저장하십시오.
@echo off
date /t
time /t
YourApp.exe
date /t
time /t
입력 mytimer.bat
명령 줄에 입력 한 다음 Enter 키를 누릅니다.
내 코드는 실행 시간을 밀리 초, 최대 24 시간까지 제공하며 로케일에 민감하지 않으며 코드가 자정을 통과하면 음수 값을 설명합니다. 지연 확장을 사용하므로 cmd / bat 파일에 저장해야합니다.
코드 앞에 :
SETLOCAL EnableDelayedExpansion
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%
코드 후에 :
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000
HH : mm : ss.000 형식으로 실행 시간을 원하는 경우 다음을 추가하십시오.
set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%
ENDLOCAL
변하기 쉬운 t2
은 실행 시간을 유지 echo %t2%
하며 표시 할 수 있습니다 .
Perl이 사용 가능한 고용 솔루션을 설치 한 후 다음을 실행하십시오.
C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result
STDERR은 측정 된 초 전에옵니다
#!/usr/bin/perl -w
use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];
my $stdout = `@ARGV`;
my $time_elapsed = Time::HiRes::tv_interval( $T0 );
print $time_elapsed, "\n";
print $stdout;
서브를 사용하여 100 분의 1 초로 시간 반환
::tiemeit.cmd
@echo off
Setlocal EnableDelayedExpansion
call :clock
::call your_command or more > null to pipe this batch after your_command
call :clock
echo %timed%
pause
goto:eof
:clock
if not defined timed set timed=0
for /F "tokens=1-4 delims=:.," %%a in ("%time%") do (
set /A timed = "(((1%%a - 100) * 60 + (1%%b - 100)) * 60 + (1%%c - 100)) * 100 + (1%%d - 100)- %timed%"
)
goto:eof
지역 포맷, 24 시간 및 혼합 입력을 지원하는 "린과 평균"TIMER
적응 Aacini의 대체 방법 본체, 아니 IF의, 하나 개를위한 (내 지역 수정)
1 : % timer % 또는 현재 디렉토리에 timer.bat 파일이 있습니다.
@echo off & rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!" & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof
사용법 :
timer & echo start_cmds & timeout / t 3 & echo end_cmds & timer
timer & timer "23 : 23 : 23,00"
timer "23 : 23 : 23,00"& timer
timer "13.23.23,00"& timer "03 : 03 : 03.00"
타이머 및 타이머 "0 : 00 : 00.00"no & cmd / v : on / c 자정까지 반향 =! timer_end!
입력이 가능하지 않을 수도 있지만 실행 중에 시간 형식이 변경 될 수 있습니다.
2 : 기능 : 배치 스크립트와 함께 번들로 제공되는 타이머 (아래 샘플 사용) :
@echo off
set "TIMER=call :timer" & rem short macro
echo.
echo EXAMPLE:
call :timer
timeout /t 3 >nul & rem Any process here..
call :timer
echo.
echo SHORT MACRO:
%TIMER% & timeout /t 1 & %TIMER%
echo.
echo TEST INPUT:
set "start=22:04:04.58"
set "end=04.22.44,22"
echo %start% ~ start & echo %end% ~ end
call :timer "%start%"
call :timer "%end%"
echo.
%TIMER% & %TIMER% "00:00:00.00" no
echo UNTIL MIDNIGHT: %timer_end%
echo.
pause
exit /b
:: 테스트하려면 위와 아래의 코드 섹션을 복사하여 붙여 넣습니다.
rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support
:timer Usage " call :timer [input - optional] [no - optional]" :i Result printed on second call, saved to timer_end
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!" & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof
CE, DE 및 CS, DS는 콜론 엔드, 도트 엔드 및 콜론 세트, 도트 세트-혼합 형식 지원에 사용
다음 스크립트는 * nix epoch 시간을 에뮬레이트하지만 지역 및 지역에 따라 다릅니다. 윤년을 포함한 캘린더 엣지 케이스를 처리해야합니다. 만약 Cygwin에서이 가능하며, 시대 값은 지정하여 비교 될 수 Cygwin에서 옵션을 선택합니다.
저는 EST에 있으며보고 된 차이는 4 시간이며 비교적 정확합니다. TZ 및 지역 종속성을 제거하는 몇 가지 흥미로운 솔루션이 있지만, 눈치 채지 못한 것은 없습니다.
@ECHO off
SETLOCAL EnableDelayedExpansion
::
:: Emulates local epoch seconds
::
:: Call passing local date and time
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END
:: Not testing - print and exit
IF NOT "%~1"=="cygwin" (
ECHO !SECONDS!
GOTO END
)
:: Call on Cygwin to get epoch time
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c
:: Show the results
ECHO Local Seconds: !SECONDS!
ECHO Epoch Seconds: !EPOCH!
:: Calculate difference between script and Cygwin
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600
:: Delta hours shown reflect TZ
ECHO Delta Hours: !HOURS! Remainder: !FRAC!
GOTO END
:SECONDS
SETLOCAL EnableDelayedExpansion
:: Expecting values from caller
SET DATE=%~1
SET TIME=%~2
:: Emulate Unix epoch time without considering TZ
SET "SINCE_YEAR=1970"
:: Regional constraint! Expecting date and time in the following formats:
:: Sun 03/08/2015 Day MM/DD/YYYY
:: 20:04:53.64 HH:MM:SS
SET VALID_DATE=0
ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
SET VALID_TIME=0
ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
IF !VALID_DATE! EQU 0 ECHO Unsupported Date value: !DATE! 1>&2
IF !VALID_TIME! EQU 0 ECHO Unsupported Time value: !TIME! 1>&2
SET SECONDS=0
GOTO SECONDS_END
)
:: Parse values
SET "YYYY=!DATE:~10,4!"
SET "MM=!DATE:~4,2!"
SET "DD=!DATE:~7,2!"
SET "HH=!TIME:~0,2!"
SET "NN=!TIME:~3,2!"
SET "SS=!TIME:~6,2!"
SET /A YEARS=!YYYY!-!SINCE_YEAR!
SET /A DAYS=!YEARS!*365
:: Bump year if after February - want leading zeroes for this test
IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1
:: Remove leading zeros that can cause octet probs for SET /A
FOR %%r IN (MM,DD,HH,NN,SS) DO (
SET "v=%%r"
SET "t=!%%r!"
SET /A N=!t:~0,1!0
IF 0 EQU !N! SET "!v!=!t:~1!"
)
:: Increase days according to number of leap years
SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4
:: Increase days by preceding months of current year
FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
SET "n=%%n"
IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
)
:: Multiply and add it all together
SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!
:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF
:END
ENDLOCAL
@echo off
setlocal enableextensions
REM set start time env var
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )
## PUT_HERE_THE_COMMAND_TO_RUN ##
REM echo elapsed time
php -r "echo 'elapsed: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' seconds' . mb_convert_encoding(' ', 'UTF-8', 'HTML-ENTITIES');"
cygwin 또는 신뢰할 수없는 유틸리티가 필요하지 않습니다. PHP가 로컬에서 사용 가능한 경우 유용
정밀도 및 출력 형식을 쉽게 조정할 수 있습니다
동일한 아이디어를 PowerShell에 이식 할 수 있습니다.