回答:
Windows 2003を使用している場合(Windows Server 2008以降はサポートされていないことに注意)、詳細な実行統計を表示するtimeit.exeが含まれているWindows Server 2003リソースキットを使用できます。次に、コマンド「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 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
.exe
現在のディレクトリでをベンチマークする場合は、これを使用しますMeasure-Command { .\your.exe }
。pwd
明示的に指示されない限り、PowerShellはどうやらそれを実行しません。
<stdout>
お望みならば
次のスクリプトを新しいバッチファイル(timecmd.batなど)にコピーしてみてください。
@echo off
@setlocal
set start=%time%
:: Runs your command
cmd /c %*
set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)
使用法
パスのディレクトリにtimecmd.batを配置すると、次のようにどこからでも呼び出すことができます。
timecmd [your command]
例えば
C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18
出力のリダイレクトを行う場合は、次のようにコマンドを引用できます。
timecmd "dir c:\windows /s > nul"
これは、午前0時前から深夜後まで実行されるコマンドを処理する必要がありますが、コマンドが24時間以上実行される場合、出力は正しくありません。
timecmd pause
と、常に1.00秒、2.00秒、4.00秒、さらには0.00秒になります。Windows 7
delims=:.
するとdelims=:.,
、「全面的に」機能するはずです。
set start=10:10:10.10
set end=10:11:10.09
そして、出力されます: command took 0:1:-1.99 (59.99s total)
"lss 0"比較を行う4行の順序を逆にして、桁上げが下位から上位へと正しく進むようにします。その後、出力は次のようになります。 command took 0:0:59.99 (59.99s total)
へへ、最も簡単な解決策は次のようになるでしょう:
echo %time%
YourApp.exe
echo %time%
これはすべてのWindowsでそのまま動作します。
コンソール出力を使用するアプリケーションの場合、一時変数に開始時刻を格納すると便利な場合があります。
set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time%
申し訳ありませんが、コメントで改行を取得できませんでした)
set
は数学を行うために使用することができます。;-)
ちょっと待って、気にしないで、あなたはすでにそれを下でやった
from PowerShellの使用に関するCasey.Kからの回答のほんの少し拡大:Measure-Command
次のように、標準のコマンドプロンプトからPowerShellを呼び出すことができます。
powershell -Command "Measure-Command {echo hi}"
これは標準出力| Out-Default
を消費しますが、PowerShellから次のように追加することで防止できます。
Measure-Command {echo hi | Out-Default}
または、コマンドプロンプトから:
powershell -Command "Measure-Command {echo hi | Out-Default}"
もちろん、これをスクリプトファイル*.ps1
またはで自由にラップできます*.bat
。
measureTime.bat "c:\program files\some dir\program.exe"
Windows Server 2008 R2で使用するワンライナーは次のとおりです。
cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"
mycommandが引用符を必要としない限り(これはcmdの引用処理に影響します)。これ/v:on
は、コマンドの実行時に一度ではなく、2つの異なるTIME値を個別に評価できるようにするためです。
^
、cmdで引用符をエスケープできます(など^"
)
cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!
。
echo %time% & *mycommand* & call echo %^time%
。この回答も参照してください。
cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
コマンドウィンドウを開いて手動でコマンドを呼び出す場合、各プロンプトにタイムスタンプを表示できます。
prompt $d $t $_$P$G
それはあなたに次のようなものを与えます:
23.03.2009 15:45:50,77
C:\>
コマンドを実行する小さなバッチスクリプトがある場合は、各コマンドの前に空行を入れます。
(空行)
myCommand.exe
(次の空行)
myCommand2.exe
プロンプトの時間情報により、各コマンドの実行時間を計算できます。おそらく、さらに分析するために出力をテキストファイルにパイプするのが最善でしょう。
MyBatchFile.bat > output.txt
他の人はフリーウェアやPowerShellなどのインストールを推奨しているため、Cygwinをインストールすることもできます。これにより、timeなどの多くの基本的なUnixコマンドにアクセスできます。
abe@abe-PC:~$ time sleep 5
real 0m5.012s
user 0m0.000s
sys 0m0.000s
Cygwinがどれほどのオーバーヘッドを追加するかわかりません。
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:
time
は/t
、現在のシステム時刻を表示するオプションがあり、新しい時刻の入力を求めるプロンプトは表示されません。ただし、これを行うと、時間と分のみが表示されるため、使用状況によっては十分でない場合があります。(この質問に対するJohn Snowの回答を参照してください。)
time /T
プロセスが数分間実行された場合にのみ使用できます!time < nul
醜いですが、より正確です。
echo %time%
と同じ形式と精度を提供するを使用することもできますがtime < nul
、Enter the new time:
出力は回避されます...
wmic os get LocalDateTime
「GS Timer」というフリーウェアを使用しています。
次のようなバッチファイルを作成するだけです。
timer
yourapp.exe
timer /s
一連の時間を必要とする場合は、タイマー/ sの出力を.txtファイルにパイプするだけです。
ここから入手できます:Gammadyneの無料DOSユーティリティ
分解能は0.1秒です。
Windows XPを使用していますが、何らかの理由でtimeit.exeが機能しません。別の代替案を見つけました-PTIME。これは非常にうまく機能します。
http://www.pc-tools.net/win32/ptime/
例-
C:\> ptime
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
Syntax: ptime command [arguments ...]
ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.
C:\> ptime cd
ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>
=== cd ===
C:\
Execution time: 0.015 s
24時間以上持続しない限り...
@echo off
set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)
:TimeThis
ping localhost
set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)
set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%
echo.
echo Took: %timetaken% sec.
がここにあります
使用例:
タイムアウト1 | TimeIt.cmd
Execution took ~969 milliseconds.
これをコピーして、たとえば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」バージョンに基づいています
測定時間の代替は、単に「Get-Date」です。転送出力などの面倒はありません。
$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start
出力:
Days : 0
Hours : 0
Minutes : 0
Seconds : 1
Milliseconds : 506
Ticks : 15060003
TotalDays : 1.74305590277778E-05
TotalHours : 0.000418333416666667
TotalMinutes : 0.025100005
TotalSeconds : 1.5060003
TotalMilliseconds : 1506.0003
これは、特定のコマンドを妨害する可能性のある拡張の遅延を回避するワンライナーです。
cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "
出力は次のようになります。
14:30:27.58$ ... 14:32:43.17$ rem/
長期試験のために置き換える$T
ことにより、$D, $T
および%TIME%
によって%DATE%, %TIME%
日付が含まれるように。
この内側に使用するには、バッチファイルを置き換える%Z
ことで%%Z
。
以下は改良されたワンライナーです(拡張の遅延もありません)。
cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"
出力は次のようになります。
2015/09/01, 14:30:27.58$ rem/ ... 2015/09/01, 14:32:43.17$ prompt
このアプローチにはcmd
、結果に新しいインスタンスを作成するプロセスは含まれませんprompt
。また、コマンドも含まれません。
使用しているWindowsのバージョンに応じて、実行bash
するだけでBashモードになります。これにより、PowerShellで直接利用できない一連のコマンド(time
コマンドなど)を使用できます。コマンドのタイミングは、実行するのと同じくらい簡単です。
# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>
注: Bashモードで実行すると、簡単にBashモードを終了してメインストリームシェルに戻ることができ
exit
ます。
これは、Measure-Command
望ましくない統計を生成することがある他の方法(など)を試した後、完全に機能しました(Windows 10)。これがあなたにとってもうまくいくことを願っています。
他の誰かがこの質問への回答を求めてここに来た場合のために、というWindows API関数がありGetProcessTimes()
ます。コマンドを開始し、この呼び出しを行い、処理時間を返す小さなCプログラムを作成するのは、それほど面倒ではないようです。
これはルークサンプソンさん素敵にコメント/編集であるtimecmd.bat
とに返信
どういうわけか、これは私に整数秒で出力を与えるだけです...それは私にとって役に立たないです。つまり、timecmd pauseを実行すると、常に1.00秒、2.00秒、4.00秒...でも0.00秒になります。Windows 7. – Camilo Martin 9月25日13:16 "
構成によっては、区切り文字が異なる場合があります。次の変更は、少なくともほとんどの西側諸国を対象としています。
set options="tokens=1-4 delims=:,." (added comma)
%time%
ミリ秒「」ことを追加した後に私のシステム上で動作します
(*私は常に同じゲストメールを使用しますが、ipv6 ipとブラウザーのフィンガープリントでパスワードなしで一意に識別するのに十分であるべきですが、サイトはanonコメントを許可せず、アイデンティティを適切に追跡しません)
これが私の方法です、変換もミリ秒もありません。エンコード期間を決定するのに便利です(ただし24時間に制限されています)。
@echo off
:start
REM Start time storage
set ST=%time%
echo Process started at %ST%
echo.
echo.
REM Your commands
REM Your commands
REM Your commands
:end
REM Start Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%ST%") do set /a h1=%%a & set /a m1=%%b & set /a s1=%%c
REM End Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%TIME%") do set /a h2=%%a & set /a m2=%%b & set /a s2=%%c
REM Difference
set /a h3=%h2%-%h1% & set /a m3=%m2%-%m1% & set /a s3=%s2%-%s1%
REM Time Adjustment
if %h3% LSS 0 set /a h3=%h3%+24
if %m3% LSS 0 set /a m3=%m3%+60 & set /a h3=%h3%-1
if %s3% LSS 0 set /a s3=%s3%+60 & set /a m3=%m3%-1
echo Start : %ST%
echo End : %time%
echo.
echo Total : %h3%:%m3%:%s3%
echo.
pause
@echo off & setlocal
set start=%time%
REM Do stuff to be timed here.
REM Alternatively, uncomment the line below to be able to
REM pass in the command to be timed when running this script.
REM cmd /c %*
set end=%time%
REM Calculate time taken in seconds, to the hundredth of a second.
REM Assumes start time and end time will be on the same day.
set options="tokens=1-4 delims=:."
for /f %options% %%a in ("%start%") do (
set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a start_hs=100%%d %% 100
)
for /f %options% %%a in ("%end%") do (
set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
set /a end_hs=100%%d %% 100
)
set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%
if %hs% lss 0 (
set /a s=%s%-1
set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%
echo.
echo Time taken: %s%.%hs% secs
echo.
次のスクリプトは「cmd.exe」のみを使用し、パイプラインが作成されてからスクリプトの前のプロセスが終了するまでのミリ秒数を出力します。つまり、コマンドを入力して、スクリプトにパイプします。例:「timeout 3 | runtime.cmd」は「2990」のようなものを生成するはずです。ランタイム出力とstdin出力の両方が必要な場合は、パイプの前にstdinをリダイレクトします-例: "dir / s 1> temp.txt | runtime.cmd"は、 "dir"コマンドの出力を "temp.txt"にダンプしますランタイムをコンソールに出力します。
:: --- runtime.cmd ----
@echo off
setlocal enabledelayedexpansion
:: find target for recursive calls
if not "%1"=="" (
shift /1
goto :%1
exit /b
)
:: set pipeline initialization time
set t1=%time%
:: wait for stdin
more > nul
:: set time at which stdin was ready
set t2=!time!
::parse t1
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !
:: parse t2
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !
:: calc difference
pushd %~dp0
for /f %%i in ('%0 calc !t1!') do for /f %%j in ('%0 calc !t2!') do (
set /a t=%%j-%%i
echo !t!
)
popd
exit /b
goto :eof
:calc
set /a t=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4)
echo !t!
goto :eof
endlocal
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時間で完了しなければならないのに、オクタル安全です。
set _time=%time: =0%
1桁の時間の問題を修正-両方の場所で置き換えます。
プログラムがあるディレクトリで、と入力しnotepad mytimer.bat
、「はい」をクリックして新しいファイルを作成します。
以下のコードを貼り付け、YourApp.exe
プログラムに置き換えて保存します。
@echo off
date /t
time /t
YourApp.exe
date /t
time /t
入力しmytimer.bat
、コマンドラインに入力し、Enterキーを押します。
私のコードでは、実行時間をミリ秒単位で最大24時間まで提供します。ロケールに依存せず、コードが真夜中に実行される場合は負の値を考慮します。遅延拡張を使用し、cmd / batファイルに保存する必要があります。
コードの前:
SETLOCAL EnableDelayedExpansion
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%
あなたのコードの後:
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000
HH:mm:ss.000形式で実行時間を必要とする場合は、以下を追加します。
set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%
ENDLOCAL
変数t2
は実行時間を保持し、echo %t2%
それを表示することができます。
Perlが利用可能な採用ソリューションをインストールしたら、次を実行します。
C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result
STDERRは測定秒数の前に来ます
#!/usr/bin/perl -w
use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];
my $stdout = `@ARGV`;
my $time_elapsed = Time::HiRes::tv_interval( $T0 );
print $time_elapsed, "\n";
print $stdout;
100分の1秒単位で時間を返すためにサブを使用する
::tiemeit.cmd
@echo off
Setlocal EnableDelayedExpansion
call :clock
::call your_command or more > null to pipe this batch after your_command
call :clock
echo %timed%
pause
goto:eof
:clock
if not defined timed set timed=0
for /F "tokens=1-4 delims=:.," %%a in ("%time%") do (
set /A timed = "(((1%%a - 100) * 60 + (1%%b - 100)) * 60 + (1%%c - 100)) * 100 + (1%%d - 100)- %timed%"
)
goto:eof
地域のフォーマット、24時間と混在入力をサポートした「リーンと平均」TIMER
する適応型Aaciniの置換方法本体、無IFの、ちょうど1 FOR(私の地域の修正)
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" no&cmd / v:on / c echo until midnight =!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は、コロンエンド、ドットエンド、コロンセット、ドットセットを表します-混合フォーマットのサポートに使用されます
次のスクリプトは* nixエポック時間をエミュレートしますが、それはローカルおよびリージョナルです。うるう年を含むカレンダーエッジケースを処理する必要があります。Cygwinが使用可能な場合、Cygwinオプションを指定することにより、エポック値を比較できます。
私はESTにいますが、報告される差異は4時間であり、比較的正確です。TZと地域の依存関係を削除する興味深い解決策はいくつかありますが、私が気づいたことは簡単なことではありません。
@ECHO off
SETLOCAL EnableDelayedExpansion
::
:: Emulates local epoch seconds
::
:: Call passing local date and time
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END
:: Not testing - print and exit
IF NOT "%~1"=="cygwin" (
ECHO !SECONDS!
GOTO END
)
:: Call on Cygwin to get epoch time
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c
:: Show the results
ECHO Local Seconds: !SECONDS!
ECHO Epoch Seconds: !EPOCH!
:: Calculate difference between script and Cygwin
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600
:: Delta hours shown reflect TZ
ECHO Delta Hours: !HOURS! Remainder: !FRAC!
GOTO END
:SECONDS
SETLOCAL EnableDelayedExpansion
:: Expecting values from caller
SET DATE=%~1
SET TIME=%~2
:: Emulate Unix epoch time without considering TZ
SET "SINCE_YEAR=1970"
:: Regional constraint! Expecting date and time in the following formats:
:: Sun 03/08/2015 Day MM/DD/YYYY
:: 20:04:53.64 HH:MM:SS
SET VALID_DATE=0
ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
SET VALID_TIME=0
ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
IF !VALID_DATE! EQU 0 ECHO Unsupported Date value: !DATE! 1>&2
IF !VALID_TIME! EQU 0 ECHO Unsupported Time value: !TIME! 1>&2
SET SECONDS=0
GOTO SECONDS_END
)
:: Parse values
SET "YYYY=!DATE:~10,4!"
SET "MM=!DATE:~4,2!"
SET "DD=!DATE:~7,2!"
SET "HH=!TIME:~0,2!"
SET "NN=!TIME:~3,2!"
SET "SS=!TIME:~6,2!"
SET /A YEARS=!YYYY!-!SINCE_YEAR!
SET /A DAYS=!YEARS!*365
:: Bump year if after February - want leading zeroes for this test
IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1
:: Remove leading zeros that can cause octet probs for SET /A
FOR %%r IN (MM,DD,HH,NN,SS) DO (
SET "v=%%r"
SET "t=!%%r!"
SET /A N=!t:~0,1!0
IF 0 EQU !N! SET "!v!=!t:~1!"
)
:: Increase days according to number of leap years
SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4
:: Increase days by preceding months of current year
FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
SET "n=%%n"
IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
)
:: Multiply and add it all together
SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!
:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF
:END
ENDLOCAL
@echo off
setlocal enableextensions
REM set start time env var
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )
## PUT_HERE_THE_COMMAND_TO_RUN ##
REM echo elapsed time
php -r "echo 'elapsed: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' seconds' . mb_convert_encoding(' ', 'UTF-8', 'HTML-ENTITIES');"
cygwinや信頼できないユーティリティは必要ありません。PHPがローカルで利用可能な場合に役立ちます
精度と出力フォーマットは簡単に調整できます
同じアイデアをPowerShellに移植できます