Windows 명령 행에서 명령의 실행 시간을 어떻게 측정합니까?


답변:


113

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을 얻을 수 있습니다. 여기에서 다운로드 하십시오 .


7
이 키트에는 Windows 2008 64 비트 관련 문제가 있으며 2008 R2에서는 작동하지 않습니다
Artem

커널 시간 및 / 또는 생성 된 하위 프로세스가 사용하는 시간을 측정 할 수있는 방법이 있습니까?
rogerdpack

38
참고-timeit이 Windows 7 64 비트에서 작동한다고 생각하지 않습니다. "시스템 성능 데이터를 쿼리 할 수 ​​없습니다 (c0000004). 대신 Casey.K와 같은 PowerShell의"측정 명령 "을 사용하십시오. stackoverflow.com/questions/673523/…
Michael La Voie

6
Windows 7에서 " 'timeit'은 내부 또는 외부 명령, 실행 가능한 프로그램 또는 배치 파일로 인식되지 않습니다."
대령 패닉

3
Windows 10에는 명령이 표시되지 않으며 Win 10 용 Resource Kit도 쉽게 찾을 수 없습니다. 10을 위해 이것을 얻는 방법을 아는 사람이 있습니까?
Jay Imerman

469

또는 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

21
timeit.exe가 Windows 7을 지원하지 않는 것으로 보이는 Windows 7 사용자를위한 최상의 솔루션입니다
Michael La Voie

14
내부 dos 명령 (예 : dir, echo, del 등)을 사용하려는 경우 "cmd / c"를 삽입하는 것을 잊지 마십시오 : Measure-Command {cmd / c dir / sc : \ windows> nul}
LietKynes

7
.exe현재 디렉토리에서를 벤치마킹하는 경우 다음을 사용하십시오 Measure-Command { .\your.exe }. pwd명시 적으로 지시 하지 않으면 PowerShell은 분명히 실행되지 않습니다 .
Cristian Diaconescu

13
짜증나게 stdout을 숨 깁니다.
Zitrax

13
이것은 '배쉬의 시간 명령과 유사한 도구 '아닙니다 . 알고있는 것이 좋지만 ... : 중괄호로 묶인 명령의 결과 실행 하고 반환 하지 않습니다 ! <stdout>
Kurt Pfeifle

287

네가 원한다면

  1. 실행 시간을 100 분의 1 초로 측정하려면 (hh : mm : ss.ff 형식)
  2. 리소스 팩을 다운로드하여 설치할 필요가 없습니다.
  3. 거대한 DOS 대단하다처럼 보이지 않는 사람

다음 스크립트를 새 배치 파일 (예 : 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 시간 이상 실행되면 출력이 잘못됩니다.


9
명령이 다른 배치 파일이 아니면 cmd / c % *% *로 바꾸 십시오. 그런 다음 timecmd call other.bat
Jesse Chisholm

2
@JesseChisholm Windows 8 (및 Windows 7에서도 읽음)에서는 .bat를 호출 할 필요가 없습니다.
Brian J

4
어떤 이유로 든 이것은 몇 초 만에 출력을 제공합니다 ... 나에게는 쓸모가 없습니다. 나는 내가 달리는 것을 의미 timecmd pause하며, 항상 1.00 초, 2.00 초, 4.00 초, 심지어 0.00 초가됩니다! Windows 7.
Camilo Martin

9
@CamiloMartin 및 이와 같은 다른 사람들 (예 : 나와 같은)-소수점에 DOT 대신 COMMA를 사용하는 로캘이있을 수 있습니다. 따라서이 긁음에서으로 변경 delims=:.하면 delims=:.,"보드 전체"에서 작동합니다.
Tomasz Gandor

5
해당 스크립트에는 심각한 산술 오류가 있습니다. 다음과 같이 시도해보십시오. 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)
장 - 프랑수아 Larvoire

230

Hehe, 가장 간단한 해결책은 다음과 같습니다.

echo %time%
YourApp.exe
echo %time%

이것은 모든 Windows에서 기본적으로 작동합니다.


콘솔 출력을 사용하는 응용 프로그램의 경우 시작 시간을 임시 변수에 저장하는 것이 편리 할 수 ​​있습니다.

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%

163
너 미쳤어?! 여기에는 뇌에서와 같이 수학을하는 것이 포함됩니다. 이것이 우리가 컴퓨터를 발명 한 이유입니다. 그래서 우리는 그런 일을 피할 수 있습니다.
Luke Sampson 2016 년

1
훌륭한! 비록, CPU 시간을 정말 도움이되지 않습니다
엘리야 Saounkine

10
더 나은 (앱이 콘솔에 출력을 뱉으면) : set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (죄송합니다, 댓글에 줄 바꿈이 없었습니다)
Jono

1
@LukeSampson, 당신은 set수학을 할 수 있습니다 . ;-)아 잠깐만, 당신은 이미 아래에서 그렇게 했어.
Synetech

2
아니요, 이것은 잘못된 옵션입니다. CPU 시간이 아니라 벽시계 시간을 알려줍니다. 따라서 명령 줄이 100ms 밖에 걸리지 않지만 CPU를 사용하는 다른 응용 프로그램이 있으면 응용 프로그램이 몇 초가 걸릴 수 있습니다 (100x 이상). 실제로 머신이 스 래싱하는 경우 작은 100ms 앱이 실행될 때까지 1 분 정도 기다릴 수도 있습니다. 벽시계 시간이 아닌 CPU 시간을 추적하십시오!
Ryan Shillington

102

from PowerShell 사용에 대한 Casey.K의 답변 이 약간 확장 Measure-Command되었습니다 .

  1. 다음과 같이 표준 명령 프롬프트에서 PowerShell을 호출 할 수 있습니다.

    powershell -Command "Measure-Command {echo hi}"
    
  2. 표준 출력을 사용하지만 | Out-DefaultPowerShell에서 다음과 같이 추가 하면이를 방지 할 수 있습니다 .

    Measure-Command {echo hi | Out-Default}
    

    또는 명령 프롬프트에서 :

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    

물론 스크립트 파일 *.ps1또는 로 래핑 할 수도 *.bat있습니다.


1
측정하려는 명령에 따옴표가 있으면 어떻게합니까? 이 경우 .bat 스크립트로 바꿀 수 있습니까? 예를 들어measureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Windows Server 2008 R2에서 사용하는 하나의 라이너는 다음과 같습니다.

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"

너무 오래로 mycommand 따옴표를 필요로하지 않는다 (이 cmd를의 인용 처리와 나사). 이 /v:on명령은 명령 실행시 두 개의 서로 다른 TIME 값을 한 번이 아니라 독립적으로 평가할 수 있도록합니다.


이것은 "스팸"배치에서도 작동하지 않으며, 이는 첫 번째 시간 레이블을 덮어 쓰고 stackoverflow.com/questions/673523/…
Val

일반적으로 당신은에 의해 따옴표를 탈출 할 수 ^cmd를 (같은 ^")
n611x007

2
두 번째 타이밍에 대해 cmd / v : on을 반복하면 mycommand에 따옴표 가 포함될 수도 있습니다 . 예 : cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings

8
더 간단합니다 : echo %time% & *mycommand* & call echo %^time%. 이 답변 도 참조하십시오 .
Aacini

당신의 명령이 너무 많이 출력된다면, 아마도 2 개의 시간을 cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
맞추는

49

명령 창이 열려 있고 수동으로 명령을 호출하는 경우 각 프롬프트에 타임 스탬프를 표시 할 수 있습니다 (예 :

prompt $d $t $_$P$G

그것은 당신에게 다음과 같은 것을 제공합니다 :

23.03.2009 15:45:50,77

C:\>

명령을 실행하는 작은 배치 스크립트가있는 경우 각 명령 앞에 빈 줄이 있어야합니다 (예 :

(빈 줄)

myCommand.exe

(다음 빈 줄)

myCommand2.exe

프롬프트의 시간 정보로 각 명령의 실행 시간을 계산할 수 있습니다. 추가 분석을 위해 출력을 텍스트 파일로 파이프하는 것이 가장 좋습니다.

MyBatchFile.bat > output.txt

3
프롬프트 명령을 공유해 주셔서 감사합니다. 나는 많은 CMD 트릭을 보았습니다 (많은 bash 남자). 그러나 이것은 내 통지를 벗어났습니다.
Steve Howard

간단하고 우아하며 설치가 필요 없으며 한 번의 명령으로 배치 파일을 작성하지 않아도되며 배치 파일의 모든 단계에서 시간을 지정할 수 있습니다.
Matt

26

다른 사람들은 프리웨어 및 PowerShell과 같은 설치를 권장하므로 Cygwin 을 설치 하여 시간 과 같은 많은 기본 Unix 명령에 액세스 할 수 있습니다 .

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s

Cygwin이 얼마나 많은 오버 헤드를 추가하는지 확실하지 않습니다.


41
Windows 질문에 대답 할 때 Cygwin은 속이는 것으로 간주됩니다 :-)
mivk

14
그는 ResourceKit, TimeMem, ptime.exe, PowerShell 및 기타 유틸리티 사용자가 먼저 부정 행위를 시작했다고 규정했습니다. 따라서 저자는 귀하의 의견을 작성하기 전에 귀하의 의견을 부적절하게 만들었습니다.
Val

무료 프로그램 Cmder에 bash가 포함되어 있기 때문에 가장 쉬운 솔루션이라는 것을 알았으므로 이것을 상향 조정했습니다! cmder.net bash에서 공백을 이스케이프해야하는 경우 공백 바로 앞에 "따옴표"대신 블랙 슬래시를 사용하십시오. 예 : cd / c / Program \ Files /
lukescammell

24

유닉스의 일부 기능만큼 우아하지는 않지만 다음과 같은 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:

2
다른 언어로 이식 할 필요가 없다고 가정하면 "time <nul"이후에 findstr "현재"또는 이와 유사한 것을 넣을 수도 있습니다 (nul을 잘 사용하지만 항상 echo. | time을 사용했습니다). 그것은 우아하게 보이지 않습니다 :)). "for"를 사용하여 텍스트가 아닌 시간 만 추출하십시오.
Joey

2
명령 확장이 활성화 된 경우 (즉, 기본값), Win XP 버전의 옵션에는 새 시간을 입력하라는 메시지가 표시되지 않고 현재 시스템 시간 만 표시 time하는 /t옵션이 있습니다. 그러나 그렇게하면 시간과 분만 표시되므로 일부 용도로는 충분하지 않을 수 있습니다. (이 질문에 대한 John Snow의 답변을 참조하십시오.)
martineau

3
time /T프로세스가 몇 분 동안 실행되는 경우에만 사용할 수 있습니다! time < nul더 추악하지만 더 정확합니다.
PhiLho

6
당신은 또한 사용할 수 echo %time%와 동일한 형식 및 정밀도를 제공하는 time < nul,하지만 당신은 피 Enter the new time:... 출력
aschipfl

로케일 독립형 amd보다 정확한 시간 사용wmic os get LocalDateTime
phuclv

19

"GS Timer"라는 프리웨어를 사용합니다.

다음과 같이 배치 파일을 만드십시오.

timer
yourapp.exe
timer /s

시간이 필요한 경우 timer / s의 출력을 .txt 파일로 파이프하십시오.

여기에서 얻을 수 있습니다 : Gammadyne의 무료 DOS 유틸리티


해상도는 0.1 초입니다.


4
타사 응용 프로그램을 사용하는 것이 "표준 수단으로"수행하는 것으로 간주 될 수 있다고 생각하지 않습니다.
martineau

4
질문자는 "추가 소프트웨어를 설치하지 않고"라는 의미 였지만 최상위 (허용되는) 대답에는 전체 Windows 2003 Resource Kit를 설치해야합니다! 어쨌든 timer.exe는 내가 찾던 것에 완벽했습니다. 감사합니다!
휴고

1
이것은 심어진 링크입니다. SoftPedia는 클릭 팜입니다.
Tom A

@Tom 설명하십시오. "식물 링크"란 무엇을 의미합니까?
pepoluan

10
다음은 개발자 자신의 페이지로 직접 연결되는 링크입니다. gammadyne.com/cmdline.htm#timer
Hugo

14

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

Windows 8.1에서도 잘 작동합니다. ptime이라는 이름을 기억할 수 없기 때문에 이름을 timer.exe로 바꿨습니다.
Brian Burns

11

도 있습니다 TimeMem (2012 월)은 :

프로그램을 실행하고 실행 시간, 메모리 사용량 및 IO 통계를 표시하는 Windows 유틸리티입니다. 기능상 Unix 시간 유틸리티와 유사합니다.


10

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.

5
인상적이지만 시작 또는 종료 시간에 08 또는 09가 8 진수로 해석되어 있기 때문에 작동하지 않는다고 생각합니다. 내 대답은 그것을 처리합니다 :)
Luke Sampson

6

여기에

접미사 타이머 버전 :

사용 예 :

타임 아웃 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

^- '다니엘 스파크'버전 기준


5

측정 시간의 대안은 단순히 "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

이것은 나를 위해 완벽했다
Brett Rowberry

4

이것은 지연 확장 을 피하는 하나의 라이너로 특정 명령을 방해 할 수 있습니다.

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명령 이 포함되지 않습니다 .


4

사용중인 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) . 이것이 당신에게도 효과가 있기를 바랍니다.


2
Windows 10 1607부터 가장 좋은 답변입니다.
CarpeDiemKopi

2

다른 사람이이 질문에 대한 답을 찾고자하는 경우,라는 Windows API 함수가 GetProcessTimes()있습니다. 명령을 시작하고 호출하고 프로세스 시간을 반환하는 작은 C 프로그램을 작성하는 것은 너무 많은 일처럼 보이지 않습니다.


3
명령을 시작할 작은 C 프로그램을 다운로드하고,이 호출을 수행하고 (더 많은 사전 측정) 프로세스 시간을 반환하는 것은 너무 많은 일처럼 보이지 않습니다.
Elazar Leibovich

@ElazarLeibovich 파워 쉘? C #에서 호출 할 수 있습니다.
KeyWeeUsr

당신은 PS에서 Windows API IIRC을 사용할 수 있습니다 @KeyWeeUsr blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/...
Elazar Leibovich에게

2

이것은 누가 복음 샘슨의 좋은에게 의견 / 편집입니다 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 및 브라우저 지문과 결합 된 동일한 게스트 이메일을 비밀번호없이 고유하게 식별하기에 충분해야 항상 사이트에서 익명 코멘트를 허용하지 않고 신원을 잘 추적하지 않기 때문에)


나는 당신의 대답으로 스크롤하기 전에 그에 대해 언급했습니다. 어쨌든, Luke의 스크립트는 1 초가 아닌 밀리 초가 아닌 BTW 가 아니라 시간, 분, 초를 0으로 표시 할 수 있습니다. 여기를 참조하십시오 : en.wiktionary.org/wiki/centisecond
Tomasz Gandor

2

여기 내 방법, 변환 및 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

1
@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.

작동하지 않습니다. 점점 : 불균형 괄호. 불균형 괄호. 피연산자가 없습니다.
Richard Sandoz

@RichardSandoz 그것은 잘 작동하고 불균형 괄호는 없습니다. 어떻게 사용합니까?
MikeM

1

다음 스크립트는 "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

스크립트 를 재귀 적으로 호출 하는 대신 다음과 같이 수행하십시오 call :calc. 나는 그것을 여기에서했다. 링크 코드는 이런 식으로 더 좋은 점이 있습니다. : D
Nadu

버그 # 1 12 시간에 실패합니다. 예 : " 0 : 23 : 19,42" 버그 # 2 소수점 이외의 다른 값이 있으면 실패합니다. 같은 예 : "0:23:19 , 42"소수점은, <__________> 수정을 시도했지만 '수정 승인위원회'에서 바보 ****가 거부했습니다. 많은 저자의 원래 의도. " 행운의 편집을 시도하거나 버그를 유지하고 싶다면 '저자의 원래 의도는 그대로 유지됩니다.' facepalm
Nadu

시계의 해상도가 1/100 초의 해상도를 거의 지원하지 않으면 밀리 초를 출력 할 수 없습니다.
jwdonahue

1

드리블 리오 의 대답은 조금 더 짧게 만들 수 있습니다 (많은 읽을 수는 없지만)

@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 시간 내에 작업을 완료해야합니다.


작동하지 않습니다. 한 자리 시간에 연산자가 없습니다.
Richard Sandoz

set _time=%time: =0%한 자리 시간 문제를 해결-두 곳에서 교체하십시오.
Laur

1
  1. 프로그램이있는 디렉토리에서을 입력 notepad mytimer.bat하고 '예'를 클릭하여 새 파일을 작성하십시오.

  2. 아래 코드를 붙여 YourApp.exe넣어 프로그램으로 바꾼 다음 저장하십시오.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. 입력 mytimer.bat명령 줄에 입력 한 다음 Enter 키를 누릅니다.


7
time / t는 HH : MM의 시간 만 제공합니다. 실행 파일의 시간을 정하려면 일반적으로 정확도가 더 높아야합니다. 몇 분의 1 초로 줄일 수있는 설정입니까? JohnW (시간 <nul)의 용질을 테스트했으며 실제로 1 / 100s로 시간을 줄였습니다. HH : MM : SS.XX
awe

1

내 코드는 실행 시간을 밀리 초, 최대 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%하며 표시 할 수 있습니다 .


1

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;

0

서브를 사용하여 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

0

지역 포맷, 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는 콜론 엔드, 도트 엔드 및 콜론 세트, 도트 세트-혼합 형식 지원에 사용


0

다음 스크립트는 * 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

downvote에 대해 궁금합니다. 감사.
bvj

0

cmd 및 하나의 env에 순수한 PHP를 사용하는 솔루션. 변하기 쉬운:

@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('&#13;&#10;', 'UTF-8', 'HTML-ENTITIES');"
  • cygwin 또는 신뢰할 수없는 유틸리티가 필요하지 않습니다. PHP가 로컬에서 사용 가능한 경우 유용

  • 정밀도 및 출력 형식을 쉽게 조정할 수 있습니다

  • 동일한 아이디어를 PowerShell에 이식 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.