web-dev-qa-db-ja.com

Windowsのコマンドラインでコマンドの実行時間を測定する方法を教えてください。

Windowsのコマンドラインでコマンドの実行時間を測定するための組み込みの方法はありますか?

437
Kuroki Kaze

Windows 2003を使用している場合(Windows Server 2008以降はサポートされていません)、Windows Server 2003リソースキットを使用できます。このキットには、詳細な実行統計を表示するtimeit.exeが含まれています。これは、コマンド "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

TimeItはWindows 2003 Resource Kitで入手できます。それをダウンロードしなさい ここ

106
MikeA

あるいは、Windows PowerShellにはBashの "time"コマンドに似た組み込みコマンドがあります。これは「測定コマンド」と呼ばれます。 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
418
Casey.K

お望みならば

  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"

これは、午前0時前から深夜0時以降に実行されるコマンドを処理するはずですが、コマンドが24時間以上実行されると、出力は正しくなくなります。

260
Luke Sampson

Hehe、最も簡単な解決策はこれでしょう:

echo %time%
YourApp.exe
echo %time%

これはすべてのWindowsでそのまま使用できます。


コンソール出力を使用するアプリケーションの場合は、開始時刻を一時変数に格納すると便利です。

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

PowerShell からの Measure-Command の使用についての Casey.K _のちょっとした拡張:

  1. 次のように、標準のコマンドプロンプトからPowerShellを起動できます。

    powershell -Command "Measure-Command {echo hi}"
    
  2. これは標準出力を使いますが、PowerShellからこのように| Out-Defaultを追加することでそれを防ぐことができます。

    Measure-Command {echo hi | Out-Default}
    

    またはコマンドプロンプトから:

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

もちろん、これをスクリプトファイル*.ps1または*.batで自由にラップできます。

78

Windows Server 2008 R2で使用しているワンライナーは次のとおりです。

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

mycommand がクォートを必要としない限り(cmdのクォート処理に適しています)。 /v:onは、コマンドの実行時に一度ではなく、2つの異なるTIME値を独立して評価できるようにするためのものです。

51
Nathan Herring

コマンドウィンドウを開いて手動でコマンドを呼び出す場合は、各プロンプトにタイムスタンプを表示できます。

Prompt $d $t $_$P$G

それはあなたのようなものを与えます:

23.03.2009 15:45:50,77

C:\>

コマンドを実行する小さなバッチスクリプトがある場合は、各コマンドの前に空の行を入れます。

(空行)

myCommand.exe

(次の空行)

myCommand2.exe

プロンプト内の時間情報によって、各コマンドの実行時間を計算できます。最善の方法は、さらに分析するために出力をテキストファイルにパイプ処理することです。

MyBatchFile.bat > output.txt
46
Treb

他の人がフリーウェアやPowerShellのようなものをインストールすることを推奨しているので、 Cygwin をインストールすることもできます。これにより time のような多くの基本的なUnixコマンドにアクセスできます。

abe@abe-PC:~$ time sleep 5

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

Cygwinがどの程度のオーバーヘッドを追加するのかわからない。

25
Abe Voelker

Unixのいくつかの機能ほどエレガントではありませんが、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:
21
JohnW

私は "GS Timer"と呼ばれるフリーウェアを使います。

このようなバッチファイルを作るだけです:

timer
yourapp.exe
timer /s

一連の時間が必要な場合は、timerの出力を.txtファイルにパイプ処理するだけです。

あなたはそれをここで得ることができます: Gammadyneの無料DOSユーティリティ


分解能は0.1秒です。

17
pepoluan

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 <[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
13
Murali Krishnan

それが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.
10
driblio

TimeMem (2012年3月)もあります。

これは、プログラムを実行し、その実行時間、メモリ使用量、およびIO統計を表示するWindowsユーティリティです。機能的にはUNIXのtimeユーティリティと似ています。

9
Martin Moene

これは、 特定のコマンドを乱す可能性がある/ - 遅延の展開 を回避するワンライナーです。

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
aschipfl

がここにあります

Postfixタイマーのバージョン

使用例

タイムアウト1 | TimeIt.cmd

Execution took  ~969 milliseconds.

これをコピーして、例えば Notepad ++ のようなエディタに貼り付け、 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

^ - 'Daniel Sparks'バージョン に基づく

3
Nadu

この質問に対する回答を探している人が他にいらっしゃった場合に備えて、 GetProcessTimes() という名前のWindows API関数があります。コマンドを起動し、この呼び出しを行い、処理時間を返すような小さなCプログラムを作成するのは、それほど面倒な作業ではありません。

2
Jeff Pratt

測定時間の代わりになるのは、単に「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
2
Rainer

これ はLuke SampsonのNice timecmd.batへのコメント/編集であり、に返信しています

どういうわけかこれはほんの数秒で私に出力を与えるだけです...私にとってはこれは無駄です。私はtimecmd pauseを実行することを意味し、それは常に1.00秒、2.00秒、4.00秒...さらには0.00秒になります!ウィンドウズ7。 - カミロマルティン16 9月25日16:00 "

構成によっては、区切り文字が異なる場合があります。以下の変更は少なくともほとんどの西欧諸国を対象とするはずです。

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

%time%ミリ秒は、システムに「、」を追加した後に機能します。

(* ipv6 ipとブラウザのフィンガープリントを組み合わせた同じゲスト電子メールを常に使用しているにもかかわらず、サイトがanonコメントを許可せず、身元を追跡できないため)

2

私のコードでは実行時間がミリ秒単位で表示されます。最大24時間です。ロケールに影響されず、コードが午前0時まで実行される場合は負の値を示します。それは遅延展開を使用し、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
robotik
@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
MikeM

次のスクリプトは "cmd.exe"のみを使用し、パイプラインが作成されてからスクリプトの前のプロセスが終了するまでのミリ秒数を出力します。すなわち、あなたのコマンドをタイプして、そしてスクリプトにパイプで送ってください。例: "timeout 3 | runtime.cmd"は "2990"のようになります。実行時出力と標準出力の両方が必要な場合は、標準入力をパイプの前にリダイレクトします - ex: "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
1
Daniel Sparks

使用しているWindowsのバージョンによっては、bashを実行するだけでBashモードになります。これにより、PowerShellでは直接利用できない一連のコマンド(timeコマンドなど)を使用できます。あなたのコマンドのタイミングは今実行するのと同じくらい簡単です:

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>

注: Bashモードでexitを実行すると、Bashモードを終了してメインストリームシェルに戻ることができます。

他の方法(Measure-Commandのような)を試してみると、これは私にとっては完全にうまくいきました(Windows 10)。これがあなたにとってもうまくいくことを願っています。

1
Saddam M
  1. プログラムのあるディレクトリにnotepad mytimer.batと入力し、「はい」をクリックして新しいファイルを作成します。

  2. 以下のコードを貼り付けて、YourApp.exeをプログラムに置き換えてから保存します。

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
    
  3. コマンドラインにmytimer.batと入力してEnterキーを押します。

1
John Snow

driblio の答えはもう少し短くすることができます(それほど読みやすくはありませんが)。

@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

この作業は24時間以内に完了するはずですが、Luke Sampsonの 発言 によると、このバージョンは8進数で安全です。

1
Alexander

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
Victor Mironov

"リーンアンドミーン"地域形式のTIMER、24時間入力および混合入力のサポート
Aaciniの 代入メソッド本体を適応させる、IFを含まず、FORを1つだけ(私の地域別の修正)

1:ファイル timer.bat %PATH%または現在のディレクトリのどこかに配置

@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"
timer &/ timer "0:00:00.00"いいえ&cmd/v:on/c真夜中=!timer_endまでエコーします。
ありそうにないが、実行中に可能な時間フォーマットが変わるため、入力を混在させることができます

2:機能 :timer バッチスクリプトに同梱(下記の使用例):

@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
AveYo

次のスクリプトは* nix Epoch時間をエミュレートしますが、それはローカルおよび地域です。うるう年など、カレンダーのEdgeのケースを処理する必要があります。 Cygwin が使用可能な場合は、 Cygwin オプションを指定してEpoch値を比較できます。

私は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
0
bvj

これが私の方法、変換なし、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
0
ilko

プロセスエクスプローラ プロセスを終了する前にクリックする限り、カーネル時間、ユーザー時間、およびウォールタイム(およびその他の多くのもの)を表示します。これはコマンドラインツールではありませんが、とにかく非常に便利です。

0
Matt Chambers

Luke SampsonのNiceスクリプトの場合、負の値に対する補正は、以前の0の値を負にする可能性があるため、逆の順序で行う必要があります。

たとえば、最初の減算で1時間0分になったとします。 -29秒投稿で行われたように、結果は1時間-1分31秒になります。秒が数分前に修正され、数分前に修正された場合、代わりに31秒、59分、0時間が表示されます。

0
Garr Lystad

Subを使用して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
Antoni Gual Via