web-dev-qa-db-ja.com

バッチファイルでの印刷時間(ミリ秒)

Windowsバッチファイルで時間(ms)を印刷するにはどうすればよいですか?

バッチファイルの行間を通過する時間を測定したいのですが、Windowsの「時間/ T」はミリ秒を出力しません。

58
Assaf Lavie

%time%は、呼び出しの間に十分な時間が経過していれば機能します。

@echo OFF

@echo %time%
ping -n 1 -w 1 127.0.0.1 1>nul
@echo %time%

私のシステムでは、次の出力が得られます。

6:46:13.50
6:46:13.60

96
Patrick Cuff

あなたが何かをしているなら

for /l %%i in (1,1,500) do @echo %time%

または

if foo (
    echo %time%
    do_something
    echo %time%
)

その後、単にsetlocal enabledelayedexpansionバッチファイルの先頭で!time! の代わりに %time%は、行の解析ではなく実行時に評価されます(括弧で囲まれた完全なブロックを含みます)。

35
Joey

バッチ「プログラム」の下で、必要な処理を行う必要があります。ミリ秒ではなくセンチ秒でデータを出力することに注意してください。使用されるコマンドの精度は、センチ秒のみです。

出力例を次に示します。

STARTTIME: 13:42:52,25
ENDTIME: 13:42:56,51
STARTTIME: 4937225 centiseconds
ENDTIME: 4937651 centiseconds
DURATION: 426 in centiseconds
00:00:04,26

バッチスクリプトは次のとおりです。

@echo off
setlocal

rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99
set STARTTIME=%TIME%

rem here begins the command you want to measure
dir /s > nul
rem here ends the command you want to measure

set ENDTIME=%TIME%

rem output as time
echo STARTTIME: %STARTTIME%
echo ENDTIME: %ENDTIME%

rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)

rem calculating the duratyion is easy
set /A DURATION=%ENDTIME%-%STARTTIME%

rem we might have measured the time inbetween days
if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%

rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds
set /A DURATIONH=%DURATION% / 360000
set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000
set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100
set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)

rem some formatting
if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%
if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%
if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%
if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%

rem outputing
echo STARTTIME: %STARTTIME% centiseconds
echo ENDTIME: %ENDTIME% centiseconds
echo DURATION: %DURATION% in centiseconds
echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%

endlocal
goto :EOF
25
nusi

多分 このツール 助けになるでしょうか?時間は返されませんが、コマンドにかかる時間を測定するのに適したツールです。

2
Stefan

ただ時間を稼ぐだけではないので、やりたいことに注意する必要があります。

バッチには、日付とtmeを表す内部変数%DATE%%TIME%があります。しかし、それらはWindowsロケールに依存しています。

%Date%

  • dd.MM.yyyy
  • dd.MM.yy
  • d.M.yy
  • dd/MM/yy
  • yyyy-MM-dd

%TIME%

  • H:mm:ss、ミリ秒
  • HH:mm:ss、ミリ秒

さて、スクリプトはどのくらいの時間、いつ動作しますか?たとえば、1日より長く、真夜中を過ぎた場合、真夜中の2つのタイムスタンプの差は負の値になるため、間違いが発生します。日付間の正確な距離を見つけるために日付が必要ですが、日付形式が一定でない場合はどうしますか? %DATE%および%TIME%のあるものは、数学の目的で使用し続けると、悪化する可能性があります。

%DATE%および%TIME%が存在する理由は、日付と時刻を出力に表示するためだけであり、計算に使用するためではありません。したがって、いくつかの時間値の間の正しい距離を作成したり、日付と時間に依存するいくつかの一意の値を生成したい場合は、%DATE%および%TIME%とは異なる正確なものを使用する必要があります

私はそのようなことを要求するためにwmic windows組み込みユーティリティを使用しています(スクリプトファイルに入れます):

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE`) do if "%%i" == "LocalDateTime" echo.%%j

または、cmd.exeコンソールに入力します。

for /F "usebackq tokens=1,2 delims==" %i in (`wmic os get LocalDateTime /VALUE`) do @if "%i" == "LocalDateTime" echo.%j

これの欠点は、頻繁な呼び出しの場合のパフォーマンスの低下です。鉱山機械では、1秒あたり約12コールです。

これを使い続けたい場合は、次のように書くことができます(get_datetime.bat):

@echo off

rem Description:
rem   Independent to Windows locale date/time request.

rem Drop last error level
cd .

rem drop return value
set "RETURN_VALUE="

for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if "%%i" == "LocalDateTime" set "RETURN_VALUE=%%j"

if not "%RETURN_VALUE%" == "" (
  set "RETURN_VALUE=%RETURN_VALUE:~0,18%"
  exit /b 0
)

exit /b 1

これで、スクリプト内の%RETURN_VALUE%を解析できます。

call get_datetime.bat
set "FILE_SUFFIX=%RETURN_VALUE:.=_%"
set "FILE_SUFFIX=%FILE_SUFFIX:~8,2%_%FILE_SUFFIX:~10,2%_%FILE_SUFFIX:~12,6%"
echo.%FILE_SUFFIX%
2
Andry

%TIME%は深夜0時以降はH:MM:SS、CSの形式であるため、センチ秒への変換は機能しません。午前6時46分にPatrick Cuffの投稿を見ると、それは私だけではないようです。

ただし、次の行を使用すると、その問題を簡単に修正できます。

if " "=="%StartZeit:~0,1%" set StartZeit=0%StartZeit:~-10%
if " "=="%EndZeit:~0,1%" set EndZeit=0%EndZeit:~-10%

素敵なインスピレーションをありがとう!私はmplayer、ffmpeg、soxスクリプトでそれを使用して、古いPocketPlayerのメディアファイルを楽しみのためにポン引きするのが好きです。

2
Mae