Có cách tích hợp nào để đo thời gian thực hiện lệnh trên dòng lệnh Windows không?
Có cách tích hợp nào để đo thời gian thực hiện lệnh trên dòng lệnh Windows không?
Câu trả lời:
Nếu bạn đang sử dụng Windows 2003 (lưu ý rằng máy chủ windows 2008 trở lên không được hỗ trợ), bạn có thể sử dụng Bộ tài nguyên Windows Server 2003, có chứa timeit.exe hiển thị số liệu thống kê thực hiện chi tiết. Dưới đây là một ví dụ, định thời gian cho lệnh "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
Bạn có thể lấy TimeIt trong Bộ tài nguyên Windows 2003. Tải về ở đây .
Ngoài ra, Windows PowerShell có lệnh tích hợp tương tự lệnh "thời gian" của Bash. Nó được gọi là "Biện pháp-Lệnh." Bạn sẽ phải đảm bảo rằng PowerShell được cài đặt trên máy chạy nó.
Ví dụ đầu vào:
Measure-Command {echo hi}
Kết quả ví dụ:
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
trong thư mục hiện tại, hãy sử dụng : Measure-Command { .\your.exe }
. PowerShell rõ ràng không chạy mọi thứ từ pwd
trừ khi được nói rõ ràng với.
<stdout>
kết quả của lệnh được đặt trong dấu ngoặc nhọn!
Nếu bạn muốn
Hãy thử sao chép tập lệnh sau vào tệp bó mới (ví dụ: 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)
Sử dụng
Nếu bạn đặt timecmd.bat trong một thư mục trong đường dẫn của mình, bạn có thể gọi nó từ bất cứ đâu như thế này:
timecmd [your command]
Ví dụ
C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18
Nếu bạn muốn thực hiện chuyển hướng đầu ra, bạn có thể trích dẫn lệnh như thế này:
timecmd "dir c:\windows /s > nul"
Điều này sẽ xử lý các lệnh chạy từ trước đến sau nửa đêm, nhưng đầu ra sẽ sai nếu lệnh của bạn chạy trong 24 giờ trở lên.
timecmd pause
và nó luôn có kết quả trong 1 giây, 2,00 giây, 4,00 giây ... thậm chí 0,00 giây! Windows 7.
delims=:.
thành delims=:.,
, và sau đó nó sẽ hoạt động "trên bảng".
set start=10:10:10.10
set end=10:11:10.09
Và nó sẽ xuất ra: command took 0:1:-1.99 (59.99s total)
Bạn nên đảo ngược thứ tự của 4 dòng so sánh "lss 0", để quá trình thực hiện tiến triển chính xác từ các chữ số giới tính thấp đến cao. Sau đó, đầu ra trở thành: command took 0:0:59.99 (59.99s total)
Hehe, giải pháp đơn giản nhất có thể là thế này:
echo %time%
YourApp.exe
echo %time%
Điều này hoạt động trên mọi Windows ra khỏi hộp.
Trong trường hợp ứng dụng sử dụng đầu ra giao diện điều khiển, có thể thuận tiện để lưu trữ thời gian bắt đầu trong một biến tạm thời:
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%
(Xin lỗi, không thể nhận được dòng mới trong nhận xét)
set
để làm toán. ;-)
Oh chờ đã, đừng bận tâm, bạn đã làm điều đó dưới đây.
Chỉ cần mở rộng một chút câu trả lời từ Casey.K về việc sử dụng Measure-Command
từ PowerShell :
Bạn có thể gọi PowerShell từ dấu nhắc lệnh tiêu chuẩn, như thế này:
powershell -Command "Measure-Command {echo hi}"
Điều này sẽ ăn đầu ra tiêu chuẩn, nhưng bạn có thể ngăn chặn điều đó bằng cách thêm | Out-Default
như thế này từ PowerShell:
Measure-Command {echo hi | Out-Default}
Hoặc từ một dấu nhắc lệnh:
powershell -Command "Measure-Command {echo hi | Out-Default}"
Tất nhiên, bạn có thể tự do bọc nó trong một tập tin kịch bản *.ps1
hoặc *.bat
.
measureTime.bat "c:\program files\some dir\program.exe"
Lớp lót tôi sử dụng trong Windows Server 2008 R2 là:
cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"
Miễn là mycommand không yêu cầu báo giá (mà vít có xử lý báo giá của cmd). Điều /v:on
này là cho phép hai giá trị TIME khác nhau được đánh giá độc lập thay vì một lần khi thực hiện lệnh.
^
cmd (như ^"
)
cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!
.
echo %time% & *mycommand* & call echo %^time%
. Xem thêm câu trả lời này .
cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
Nếu bạn mở cửa sổ lệnh và gọi các lệnh theo cách thủ công, bạn có thể hiển thị dấu thời gian trên mỗi dấu nhắc, ví dụ:
prompt $d $t $_$P$G
Nó cung cấp cho bạn một cái gì đó như:
23.03.2009 15:45:50,77
C:\>
Nếu bạn có một tập lệnh bó nhỏ thực thi các lệnh của mình, hãy có một dòng trống trước mỗi lệnh, ví dụ:
(dòng trống)
myCommand.exe
(dòng trống tiếp theo)
myCommand2.exe
Bạn có thể tính thời gian thực hiện cho mỗi lệnh bằng thông tin thời gian trong lời nhắc. Điều tốt nhất có lẽ là chuyển đầu ra thành tệp văn bản để phân tích thêm:
MyBatchFile.bat > output.txt
Vì những người khác đang khuyên bạn nên cài đặt những thứ như phần mềm miễn phí và PowerShell, bạn cũng có thể cài đặt Cygwin , thứ sẽ cho phép bạn truy cập vào nhiều lệnh Unix cơ bản như thời gian :
abe@abe-PC:~$ time sleep 5
real 0m5.012s
user 0m0.000s
sys 0m0.000s
Không chắc chắn bao nhiêu chi phí Cygwin thêm.
Không hoàn toàn thanh lịch như một số chức năng trên Unix, nhưng tạo một tệp cmd trông giống như:
@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T
Điều đó sẽ hiển thị thời gian bắt đầu và dừng như vậy:
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
có /t
tùy chọn chỉ hiển thị thời gian hệ thống hiện tại mà không nhắc bạn nhập thời gian mới. Tuy nhiên, khi bạn làm điều đó, nó chỉ hiển thị giờ và phút, có thể không đủ tốt cho một số cách sử dụng. (Xem câu trả lời của John Snow cho câu hỏi này.)
time /T
chỉ có thể sử dụng được nếu quá trình chạy trong vài phút! time < nul
là xấu hơn nhưng chính xác hơn.
echo %time%
cung cấp định dạng và độ chính xác tương tự time < nul
, nhưng bạn tránh Enter the new time:
đầu ra ...
wmic os get LocalDateTime
Tôi sử dụng phần mềm miễn phí có tên là "GS Timer".
Chỉ cần tạo một tệp bó như thế này:
timer
yourapp.exe
timer /s
Nếu bạn cần một tập hợp thời gian, chỉ cần chuyển đầu ra của bộ định thời / s thành tệp .txt.
Bạn có thể lấy nó ở đây: Tiện ích DOS miễn phí của Gammadyne
Độ phân giải là 0,1 giây.
Tôi đang sử dụng Windows XP và vì một số lý do, timeit.exe không hoạt động với tôi. Tôi tìm thấy một sự thay thế khác - PTIME. Điều này hoạt động rất tốt.
http://www.pc-tools.net/win32/ptime/
Thí dụ -
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
Ngoài ra còn có TimeMem (tháng 3 năm 2012):
Đây là một tiện ích Windows thực thi chương trình và hiển thị thời gian thực hiện, sử dụng bộ nhớ và thống kê IO. Nó tương tự về chức năng với tiện ích thời gian Unix.
Miễn là nó không kéo dài hơn 24 giờ ...
@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.
Đây là
Ví dụ sử dụng:
thời gian chờ 1 | TimeIt.cmd
Execution took ~969 milliseconds.
Sao chép và dán phần này vào một số trình soạn thảo như ví dụ Notepad ++ và lưu nó dưới dạng 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
^ - Dựa trên phiên bản 'Daniel Sparks'
Một cách khác để đo thời gian chỉ đơn giản là "Nhận ngày". Bạn không gặp rắc rối với đầu ra chuyển tiếp, v.v.
$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start
Đầu ra:
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
Đây là một lớp lót tránh sự mở rộng bị trì hoãn , có thể làm phiền một số lệnh nhất định:
cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "
Đầu ra giống như:
14:30:27.58$ ... 14:32:43.17$ rem/
Đối với các bài kiểm tra dài hạn thay thế $T
bởi $D, $T
và %TIME%
bởi%DATE%, %TIME%
để bao gồm ngày tháng.
Để sử dụng bên trong tệp bó , thay thế %Z
bằng %%Z
.
Đây là một lớp lót được cải tiến (không bị trì hoãn mở rộng ):
cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"
Đầu ra trông tương tự như thế này:
2015/09/01, 14:30:27.58$ rem/ ... 2015/09/01, 14:32:43.17$ prompt
Cách tiếp cận này không bao gồm quá trình tạo ra một cmd
kết quả mới trong kết quả, và cũng không bao gồm prompt
(các) lệnh.
Tùy thuộc vào phiên bản Windows bạn đang sử dụng, chỉ cần chạy bash
sẽ đưa bạn vào chế độ Bash. Điều này sẽ cho phép bạn sử dụng một loạt các lệnh không có sẵn trên PowerShell trực tiếp (như time
lệnh). Thời gian lệnh của bạn bây giờ dễ dàng như thực thi:
# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>
Lưu ý: Bạn có thể dễ dàng thoát khỏi chế độ Bash và quay trở lại vỏ chính của mình bằng cách chạy
exit
trong khi ở chế độ Bash.
Điều này làm việc cho tôi một cách hoàn hảo (Windows 10) sau khi thử các phương pháp khác (như Measure-Command
) đôi khi tạo ra các số liệu thống kê không mong muốn. Hy vọng điều này làm việc cho bạn là tốt.
Trong trường hợp bất kỳ ai khác đến đây để tìm câu trả lời cho câu hỏi này, có một hàm API Windows được gọi GetProcessTimes()
. Có vẻ như không có quá nhiều công việc để viết một chương trình C nhỏ sẽ bắt đầu lệnh, thực hiện cuộc gọi này và trả về thời gian xử lý.
Đây là một nhận xét / chỉnh sửa cho Luke Sampson rất hay timecmd.bat
và trả lời
Vì một số lý do, điều này chỉ mang lại cho tôi đầu ra trong toàn bộ giây ... mà đối với tôi là vô ích. Ý tôi là tôi chạy tạm dừng timecmd và nó luôn có kết quả trong 1 giây, 2,00 giây, 4,00 giây ... thậm chí 0,00 giây! Windows 7. - Camilo Martin ngày 25 tháng 9 năm 13 lúc 16:00 "
Trên một số cấu hình, các dấu phân cách có thể khác nhau. Những thay đổi sau đây sẽ bao gồm ít nhất là hầu hết các nước phương tây.
set options="tokens=1-4 delims=:,." (added comma)
Các %time%
phần nghìn giây hoạt động trên hệ thống của tôi sau khi thêm ','
(* vì trang web không cho phép nhận xét anon và không theo dõi danh tính tốt mặc dù tôi luôn sử dụng cùng một email khách kết hợp với ipv6 ip và dấu vân tay của trình duyệt nên đủ để nhận dạng duy nhất mà không cần mật khẩu)
Đây là phương pháp của tôi, không chuyển đổi và không ms. Rất hữu ích để xác định thời lượng mã hóa (giới hạn trong 24 giờ):
@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.
Tập lệnh sau chỉ sử dụng "cmd.exe" và xuất ra số mili giây từ khi đường ống được tạo cho đến khi quá trình trước tập lệnh thoát ra. tức là, nhập lệnh của bạn và chuyển lệnh thành tập lệnh. Ví dụ: "thời gian chờ 3 | runtime.cmd" sẽ mang lại kết quả như "2990." Nếu bạn cần cả đầu ra thời gian chạy và đầu ra stdin, hãy chuyển hướng stdin trước ống dẫn - ví dụ: "dir / s 1> temp.txt | runtime.cmd" sẽ chuyển đầu ra của lệnh "dir" sang "temp.txt" và sẽ in thời gian chạy đến bàn điều khiển.
:: --- 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
Câu trả lời của driblio có thể được thực hiện ngắn hơn một chút (mặc dù không thể đọc được nhiều)
@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
Theo nhận xét của Luke Sampson phiên bản này là an toàn bát phân, mặc dù nhiệm vụ phải hoàn thành trong 24 giờ.
set _time=%time: =0%
khắc phục sự cố giờ một chữ số - thay thế ở cả hai nơi.
Trong thư mục chứa chương trình của bạn, nhập notepad mytimer.bat
, nhấp vào 'có' để tạo tệp mới.
Dán mã bên dưới, thay thế YourApp.exe
bằng chương trình của bạn, sau đó lưu lại.
@echo off
date /t
time /t
YourApp.exe
date /t
time /t
Gõ mytimer.bat
vào dòng lệnh sau đó nhấn Enter.
mã của tôi cung cấp cho bạn thời gian chạy tính bằng mili giây, tối đa 24 giờ, nó không nhạy cảm cục bộ và chiếm các giá trị âm nếu mã chạy suốt nửa đêm. nó sử dụng mở rộng bị trì hoãn và nên được lưu trong tệp cmd / bat.
trước mã của bạn:
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%
sau mã của bạn:
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
nếu bạn muốn thời gian chạy ở định dạng HH: mm: ss.000, hãy thêm:
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
biến t2
giữ thời gian chạy của bạn, bạn có thể echo %t2%
hiển thị nó.
Có Perl cài đặt giải pháp thuê có sẵn, chạy:
C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result
STDERR đến trước giây được đo
#!/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;
Sử dụng một phụ để trả lại thời gian trong một phần trăm giây
::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
TIMER "Lean and mean" với định dạng khu vực, 24h và hỗ trợ đầu vào hỗn hợp
Thích ứng với Aacini phương pháp thay thế cơ thể, không có NẾU, chỉ một CHO (sửa chữa khu vực của tôi)
1: Tập tin timer.bat được đặt ở đâu đó trong% PATH% hoặc thư mục hiện tại
@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
Cách sử dụng:
timer & vang start_cmds & timeout / t 3 & vang end_cmds & timer
hẹn giờ & hẹn giờ "23: 23: 23,00"
hẹn giờ "23: 23: 23,00" & timer
hẹn giờ "13.23.23,00" & timer "03: 03: 03.00"
hẹn giờ & hẹn giờ "0: 00: 00.00" không & cmd / v: on / c echo cho đến nửa đêm =! Timer_end!
Đầu vào bây giờ có thể được trộn lẫn, đối với những trường hợp không thể, nhưng có thể thay đổi định dạng thời gian trong khi thực hiện
2: Chức năng : bộ đếm thời gian đi kèm với tập lệnh bó (sử dụng mẫu bên dưới):
@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
:: để kiểm tra nó, sao chép-dán cả phần mã trên và dưới
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 và CS, DS là viết tắt của dấu hai chấm, đầu chấm và dấu hai chấm, bộ dấu chấm - được sử dụng để hỗ trợ định dạng hỗn hợp
Kịch bản sau đây mô phỏng thời gian * nix epoch, nhưng nó là cục bộ và khu vực. Nó sẽ xử lý các trường hợp cạnh lịch bao gồm cả năm nhuận. Nếu Cygwin có sẵn, các giá trị epoch có thể được so sánh bằng cách chỉ định tùy chọn Cygwin .
Tôi đang ở EST và sự khác biệt được báo cáo là 4 giờ tương đối chính xác. Có một số giải pháp thú vị để loại bỏ TZ và phụ thuộc khu vực, nhưng không có gì tầm thường mà tôi nhận thấy.
@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');"
không cần cygwin hoặc các tiện ích không đáng tin cậy. Hữu ích khi PHP có sẵn tại địa phương
độ chính xác và định dạng đầu ra có thể dễ dàng điều chỉnh
ý tưởng tương tự có thể được chuyển cho PowerShell