Jak zmierzyć czas wykonania polecenia w wierszu poleceń systemu Windows?

Czy istnieje wbudowany sposób pomiaru czasu wykonania polecenia w wierszu poleceń systemu Windows?

Author: Anthony, 2009-03-23

29 answers

Jeśli używasz systemu Windows 2003 (zauważ, że windows server 2008 i nowsze nie są obsługiwane), możesz użyć zestawu zasobów Windows Server 2003, który zawiera timeit.exe, który wyświetla szczegółowe statystyki wykonania. Oto przykład, timing polecenia " 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

Możesz uzyskać Czas w Windows 2003 Resource Kit. Pobierz go tutaj .

 103
Author: Servy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 18:34:02

Alternatywnie, Windows PowerShell ma wbudowane polecenie, które jest podobne do polecenia Bash "czas". Nazywa się " Measure-Command."Musisz upewnić się, że PowerShell jest zainstalowany na komputerze, który go uruchamia.

Przykładowe Wejście:

Measure-Command {echo hi}

Przykładowe Wyjście:

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
 384
Author: Casey.K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:20:03

Jeśli chcesz

  1. aby zmierzyć czas wykonania do setnej sekundy (hh: mm: ss.format ff)
  2. aby nie trzeba było pobierać i instalować pakietu zasobów
  3. wyglądać jak wielki dos nerd (kto nie)

Spróbuj skopiować następujący skrypt do nowego pliku wsadowego (np. 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)

Użycie

Jeśli umieścisz timecmd.bat w katalogu na twojej ścieżce, możesz wywołać go z dowolnego miejsca jak to:

timecmd [your command]

Np.

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18

Jeśli chcesz zrobić przekierowanie wyjściowe, możesz zacytować polecenie w następujący sposób:

timecmd "dir c:\windows /s > nul"

Powinno to obsługiwać polecenia uruchamiane od Przed-do po-północy, ale wynik będzie nieprawidłowy, jeśli Twoje polecenie będzie działać przez 24 godziny lub dłużej.

 240
Author: Luke Sampson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:28:38

Hehe, najprostszym rozwiązaniem może być to:

echo %time%
YourApp.exe
echo %time%
To działa na każdym oknie po wyjęciu z pudełka.

W przypadku aplikacji korzystającej z wyjścia konsoli, wygodnym może być zapisanie czasu startu w zmiennej tymczasowej:

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
 190
Author: TechGibbon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-26 13:13:47

Tylko małe rozszerzenie odpowiedzi od Casey ' a.K o korzystaniu z Measure-Command z PowerShell :

  1. Możesz wywołać PowerShell ze standardowego wiersza polecenia, w następujący sposób:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Spowoduje to zjedzenie standardowego wyjścia, ale możesz temu zapobiec, dodając | Out-Default w ten sposób z PowerShell:

    Measure-Command {echo hi | Out-Default}
    

    Lub z wiersza polecenia:

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

Oczywiście możesz zawinąć to w plik skryptu *.ps1 lub *.bat.

 68
Author: vladimir veljkovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:36:29

Jednowierszowy, którego używam w Windows Server 2008 R2 to:

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

Tak długo, jak mycommand nie wymaga cudzysłowów(co wkręca się w przetwarzanie cytatów cmd). /v:on ma pozwolić, aby dwie różne wartości czasu były oceniane niezależnie, a nie raz podczas wykonywania polecenia.

 50
Author: Nathan Herring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:18:53

Jeśli masz otwarte okno poleceń i wywołujesz je ręcznie, możesz wyświetlić znacznik czasu w każdym wierszu, np.

prompt $d $t $_$P$G

Daje coś w stylu:

23.03.2009 15:45:50,77

C:\>

Jeśli masz mały skrypt wsadowy, który wykonuje Twoje polecenia, miej pusty wiersz przed każdym poleceniem, np.

(pusty wiersz)

MyCommand.exe

(Następna pusta linia)

MyCommand2.exe

Możesz Oblicz czas wykonania każdego polecenia według informacji o czasie w wierszu polecenia. Najlepiej byłoby przekierować wyjście do pliku tekstowego do dalszej analizy:

MyBatchFile.bat > output.txt
 41
Author: Treb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:16:53

Ponieważ inni zalecają instalowanie takich rzeczy jak freeware i PowerShell, możesz również zainstalować Cygwin , co dałoby ci dostęp do wielu podstawowych komend uniksowych, takich jak time :

abe@abe-PC:~$ time sleep 5

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

Nie wiem, ile napowietrznych Cygwin dodaje.

 24
Author: Abe Voelker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-02 01:34:11

Nie jest tak elegancki jak niektóre funkcjonalności Uniksa, ale Utwórz plik cmd, który wygląda następująco:

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T

Który wyświetli czasy rozpoczęcia i zakończenia w ten sposób:

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:
 21
Author: JohnW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 11:43:51

Używam freeware o nazwie "GS Timer".

Po prostu stwórz plik wsadowy w ten sposób:

timer
yourapp.exe
timer /s

Jeśli potrzebujesz zestawu czasów, po prostu podłącz wyjście timera / s do a .plik txt.

Możesz go pobrać tutaj: Gammadyne ' s Free DOS Utilities

Rozdzielczość wynosi 0,1 sekundy.

 16
Author: pepoluan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:18:13

Używam Windows XP i z jakiegoś powodu timeit.exe nie działa dla mnie. Znalazłem inną alternatywę-PTIME. To działa bardzo dobrze.

Http://www.pc-tools.net/win32/ptime/

Przykład-

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <[email protected]>

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 <[email protected]>

===  cd ===
C:\

Execution time: 0.015 s
 11
Author: Murali Krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:31:39

Dopóki nie potrwa dłużej niż 24 godziny...

@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.
 10
Author: driblio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-10 16:25:28

Jest też TimeMem (marzec 2012):

Jest to narzędzie Windows, które wykonuje program i wyświetla jego czas wykonania, zużycie pamięci i statystyki IO. Podobnie jest w funkcjonalność do Unix time utility.

 8
Author: Martin Moene,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-21 11:03:51

Jest to jednowierszowiec, który unika opóźnionej ekspansji , co może zakłócić niektóre polecenia:

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "

Wyjście to coś w stylu:

14:30:27.58$
...
14:32:43.17$ rem/ 

W przypadku badań długoterminowych należy zastąpić $T przez $D, $T i %TIME% przez %DATE%, %TIME%, aby uwzględnić datę.

Aby użyć tego wewnątrz pliku wsadowego , zastąp %Z przez %%Z.


Update

Oto ulepszony jednowarstwowy (BEZ opóźnionego rozszerzenia też): {]}

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"

Wyjście wygląda podobnie do tego:

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt

To podejście nie obejmuje procesu tworzenia instancji nowego cmd w wyniku, ani nie obejmuje poleceń prompt.

 4
Author: aschipfl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-22 09:21:06

Oto

Postfix timer version:

Przykład użycia:

timeout 1 | Czas.cmd

Execution took  ~969 milliseconds.

Skopiuj i wklej to do jakiegoś edytora, takiego jak na przykład Notepad++ i zapisz jako 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

^ - na podstawie 'Daniel Sparks' Version

 3
Author: Nadu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:37:57

W przypadku, gdy ktoś jeszcze przyszedł tu szukać odpowiedzi na to pytanie, istnieje funkcja Windows API o nazwie GetProcessTimes(). Nie wygląda na to zbyt wiele pracy, aby napisać mały program w języku C, który uruchomi polecenie, Wykonaj to połączenie i zwróci czas procesu.

 2
Author: Jeff Pratt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 19:34:47

This is a comment/edit to Luke Sampson ' s nice timecmd.bat and reply to

Z jakiegoś powodu daje mi to wyjście tylko w ciągu kilku sekund... co dla mnie jest bezużyteczne. Chodzi mi o to, że uruchamiam timecmd pause i zawsze daje to 1.00 sek, 2.00 sek, 4.00 sek... nawet 0.00 sek! Windows 7. – Camilo Martin Sep 25 '13 at 16: 00"

W niektórych konfiguracjach ograniczniki mogą się różnić. Następująca zmiana powinna obejmować co najmniej większość krajów zachodnich.

set options="tokens=1-4 delims=:,." (added comma)

The %time% milisekundy działają na moim systemie po dodaniu, że', '

(*ponieważ strona nie pozwala na komentarz anon i nie śledzi dobrej tożsamości, mimo że zawsze używam tego samego e-maila gościa, który w połączeniu z IPv6 ip i odciskiem palca przeglądarki powinien wystarczyć, aby jednoznacznie zidentyfikować bez hasła) {]}

 2
Author: Anonymous Coward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-11 02:36:10
@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.
 1
Author: MikeM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-22 16:46:49

Poniższy skrypt używa tylko " cmd.exe " i wypisuje liczbę milisekund od czasu wytworzenia potoku do czasu zakończenia procesu poprzedzającego skrypt. np. Wpisz swoje polecenie, a następnie prześlij je do skryptu. Przykład: "timeout 3 / runtime.cmd "powinien dać coś jak" 2990."Jeśli potrzebujesz zarówno wyjścia runtime, jak i wyjścia stdin, przekieruj stdin przed pipe-ex:" dir / s 1>temp.txt / runtime.cmd "zrzuci wyjście polecenia" dir "do" temp.txt " oraz wydrukuje runtime na konsoli.

:: --- 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
 1
Author: Daniel Sparks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 05:03:36

ODPOWIEDŹ driblio może być nieco krótsza (choć mało czytelna)

@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

Do Uwagi Luke ' a Sampsona ta wersja jest Bezpieczna, choć zadanie powinno zostać wykonane w ciągu 24 godzin.

 1
Author: Alexander,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:21

Mój kod podaje czas działania w milisekundach, do 24 godzin, jest niewrażliwy na ustawienia regionalne i odpowiada wartościom ujemnym, jeśli kod działa do północy. używa opóźnionego rozszerzenia i powinien być zapisany w pliku cmd / bat.

Przed Twoim kodem:

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%

Po Twoim kodzie:

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

Jeśli chcesz Czas pracy w HH: mm: ss.000 format, dodaj:

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

Zmienna t2 przechowuje twój czas pracy, możesz echo %t2% aby go wyświetlić.

 1
Author: robotik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-01 01:45:02

Używanie sub do zwracania czasu w setnych częściach sekundy

::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
Author: Antoni Gual Via,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-09 13:22:45

"Lean and Mean" TIMER z formatem Regionalnym, 24h i obsługą mieszanych wejść
Adjusting aacini 's substitution method body, no IF' s, just one FOR (my regional fix)

1: Plik timer.bat umieszczony gdzieś w % PATH % lub bieżącym katalogu

@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

Użycie:
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"
timer & timer "0:00:00.00" no & cmd / v: on / c echo until midnight=!timer_end!
Dane wejściowe mogą być teraz mieszane, dla tych mało prawdopodobnych, ale możliwych zmian formatu czasu podczas wykonywania

2: Function : timer w pakiecie ze skryptem wsadowym (przykładowe użycie poniżej):

@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

:: aby go przetestować, skopiuj i wklej zarówno powyżej, jak i poniżej sekcji kodu

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 I CS, DS oznacza koniec dwukropka, koniec kropki i zestaw dwukropków , zestaw kropek-używany do obsługi formatu mieszanego

 0
Author: AveYo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:15
  1. W katalogu, w którym znajduje się twój program, wpisz notepad mytimer.bat, Kliknij "tak", aby utworzyć nowy plik.

  2. Wklej poniższy kod, zastępując {[2] } swoim programem, a następnie zapisz.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
    
  3. Wpisz mytimer.bat w wierszu poleceń, a następnie naciśnij Enter.

 0
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:17:31

Process Explorer wyświetli czas jądra, czas użytkownika i czas ściany (i wiele innych rzeczy) tak długo, jak klikniesz proces przed jego zakończeniem. Nie jest to narzędzie wiersza poleceń, ale i tak jest niezwykle przydatne.

 0
Author: Matt Chambers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:31:02

Dla ładnego skryptu Luke ' a Sampsona korekty wartości ujemnych powinny być wykonywane w odwrotnej kolejności, ponieważ mogą sprawić, że poprzednia wartość 0 będzie ujemna.

Weźmy na przykład Czas, w którym początkowe odejmowanie daje 1 godzinę, 0 min. i -29 sekund. Jak zrobiono w poście wynik będzie 1 godzina, -1 min i 31 sekund. Jeśli sekundy zostaną poprawione przed minutami i minutami przed godzinami, zamiast tego otrzymasz 31 sekund, 59 min, 0 godzin.

 0
Author: Garr Lystad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:32:28

Poniższy skrypt emuluje *nix epoch time, ale jest lokalny i regionalny. Powinien obsługiwać przypadki krawędzi kalendarza, w tym lata przestępne. Jeśli Cygwin jest dostępny, wartości epoch mogą być porównywane przez podanie opcji Cygwin.

Jestem w EST i zgłoszona różnica wynosi 4 godziny, co jest stosunkowo poprawne. Istnieje kilka ciekawych rozwiązań, aby usunąć tz i zależności regionalne, ale nic trywialnego, że zauważyłem.

@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
 0
Author: bvj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:34:58

Oto moja metoda, bez konwersji i bez ms. warto określić czas trwania kodowania (ograniczony do 24 godzin):

@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
 0
Author: ilko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 17:38:52

Alternatywą dla pomiaru czasu jest po prostu "Get-Date". Nie masz tego kłopotu z przekazywaniem danych wyjściowych i tak dalej.

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start

Wyjście:

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
 -1
Author: Rainer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 14:07:25