首页 文章

如何在Windows命令行上测量命令的执行时间?

提问于
浏览
409

是否有内置方法来测量Windows命令行上命令的执行时间?

29 回答

  • 0

    关于使用来自PowerShellMeasure-Commandthe answer from Casey.K的一点扩展:

    • 您可以从标准命令提示符调用PowerShell,如下所示:
    powershell -Command "Measure-Command {echo hi}"
    
    • 这将占用标准输出,但您可以通过从PowerShell添加 | Out-Default 来防止这种情况:
    Measure-Command {echo hi | Out-Default}
    

    或者从命令提示符:

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

    当然,您可以将其包装在脚本文件 *.ps1*.bat 中 .

  • 25

    我在Windows Server 2008 R2中使用的单行程序是:

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

    只要mycommand没有't require quotes (which screws with cmd'的报价处理) . /v:on 允许独立评估两个不同的TIME值,而不是在执行命令时评估一次 .

  • 1

    如果您使用的是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
    

    您可以在Windows 2003 Resource Kit中获取TimeIt . 下载here .

  • 0

    或者,Windows PowerShell具有类似于Bash的“time”命令的内置命令 . 它被称为“测量 - 命令” . 您必须确保在运行它的计算机上安装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
    
  • 104

    如果你想

    • 以(hh:mm:ss.ff格式)测量执行时间到百分之一秒

    • 无需下载和安装资源包

    • 看起来像一个巨大的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)
    

    Usage

    如果将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"
    

    这应该处理从午前到午夜之间运行的命令,但如果命令运行24小时或更长时间,输出将是错误的 .

  • 1

    呵呵,最简单的解决方案可能就是:

    echo %time%
    YourApp.exe
    echo %time%
    

    这适用于每个开箱即用的Windows .


    如果应用程序使用控制台输出,则可以方便地将开始时间存储在临时变量中:

    set startTime=%time%
    YourApp.exe
    echo Start Time: %startTime%
    echo Finish Time: %time%
    
  • 69

    如果有其他人来这里寻找这个问题的答案,那么有一个名为GetProcessTimes()的Windows API函数 . 编写一个可以启动命令,进行此调用并返回处理时间的小C程序看起来不是太多工作 .

  • 197

    如果打开命令窗口并手动调用命令,则可以在每个提示上显示时间戳,例如:

    prompt $d $t $_$P$G
    

    它给你的东西:

    23.03.2009 15:45:50,77 C:>

    如果您有一个执行命令的小批处理脚本,则在每个命令之前都有一个空行,例如

    (空行)myCommand.exe(下一个空行)myCommand2.exe

    您可以通过提示中的时间信息计算每个命令的执行时间 . 最好的方法是将输出传递给文本文件以进行进一步分析:

    MyBatchFile.bat > output.txt
    
  • 1

    由于其他人建议安装免费软件和PowerShell之类的东西,你也可以安装Cygwin,它可以让你访问许多基本的Unix命令,如time

    abe@abe-PC:~$ time sleep 5
    
    real    0m5.012s
    user    0m0.000s
    sys 0m0.000s
    

    不确定Cygwin增加了多少开销 .

  • 1

    不像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:
    
  • 8

    我使用名为“GS Timer”的免费软件 .

    只需制作一个这样的批处理文件:

    timer
    yourapp.exe
    timer /s
    

    如果需要一组时间,只需将timer / s的输出传递到.txt文件中 .

    你可以在这里得到它:Gammadyne's Free DOS Utilities


    分辨率为0.1秒 .

  • 4

    我正在使用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
    
  • -1

    只要它持续时间不超过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.
    
  • 2

    还有TimeMem(2012年3月):

    这是一个Windows实用程序,它执行程序并显示其执行时间,内存使用情况和IO统计信息 . 它的功能类似于Unix时间实用程序 .

  • 399

    这是一个单行程,避免delayed expansion,这可能会打扰某些命令:

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

    输出类似于:

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

    对于长期测试,请将 $D, $T 替换为 $D, $T ,将 %DATE%, %TIME% 替换为 %DATE%, %TIME% 以包含日期 .

    要在 batch file 中使用它,由 %%Z 替换 %Z .


    更新

    这是 improved one-liner (也没有delayed expansion):

    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 $提示

    此方法不包括在结果中实例化新的 cmd 的过程,也不包括 prompt 命令 .

  • 250

    这里有一个

    后缀计时器版本:

    用法示例:

    超时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' Version

  • 50

    这是对Luke Sampson的好评 timecmd.bat 的评论/编辑并回复

    出于某种原因,这只能让我在几秒钟内输出......这对我来说毫无用处 . 我的意思是我运行timecmd暂停,它总是导致1.00秒,2.00秒,4.00秒......甚至0.00秒! Windows 7. - Camilo Martin 2013年9月25日16:00“

    在某些配置中,分隔符可能不同 . 以下变化应涵盖至少大多数西方国家 .

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

    添加','后, %time% 毫秒在我的系统上工作

    (*因为网站不允许匿名评论,并且不能保持良好的身份跟踪,即使我总是使用与ipv6 ip和浏览器指纹相结合的同一个客户电子邮件应该足以唯一识别而无需密码)

  • 43
    @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.
    
  • 21

    以下脚本仅使用“cmd.exe”,并输出从创建管道到脚本退出之前的进程的毫秒数 . 即,键入您的命令,并将其传递给脚本 . 示例:“timeout 3 | runtime.cmd”应该产生类似“2990”的内容 . 如果你需要运行时输出和stdin输出,在管道之前重定向stdin - 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
    
  • 16

    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
    

    对于Luke Sampson的remark,这个版本是八进制安全的,但任务应该在24小时内完成 .

  • 12
    • 在程序所在的目录中,键入 notepad mytimer.bat ,单击'yes'以创建新文件 .

    • 粘贴下面的代码,将 YourApp.exe 替换为您的程序,然后保存 .

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
    
    • 在命令行中键入 mytimer.bat ,然后按Enter键 .
  • 3

    我的代码以毫秒为单位为您提供运行时间,最多24小时,对区域设置不敏感,如果代码在午夜运行,则会出现负值 . 它使用延迟扩展,并应保存在cmd / bat文件中 .

    before your code:

    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%
    

    after your code:

    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
    

    if you want running time in HH:mm:ss.000 format, add:

    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

    使用sub以百分之一秒为单位返回时间

    ::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

    "Lean and Mean" TIMER with Regional format, 24h and mixed input support
    适应Aacini's替换方法体,没有IF,只有一个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
    timertimer "23:23:23,00"
    timer "23:23:23,00"& timer
    timer "13.23.23,00"& timer "03:03:03.00"
    timertimer "0:00:00.00" no&cmd / v:on / c echo直到午夜=!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

    Process Explorer将显示内核时间,用户时间和待机时间(以及许多其他内容),只要您在退出之前单击该进程即可 . 它不是一个命令行工具,但它无论如何都非常有用 .

  • 0

    对于Luke Sampson的好脚本,负值的修正应该以相反的顺序进行,因为它们可以使先前的0值变为负值 .

    例如,初始减法给出1小时0分钟的时间 . 和-29秒 . 正如在帖子中所做的那样结果将是1小时,-1分钟和31秒 . 如果在小时前几分钟和几分钟之前更正秒数,则需要31秒,59分钟,0小时 .

  • 0

    以下脚本模拟* nix纪元时间,但它是本地和区域的 . 它应该处理包括闰年在内的压延边缘情况 . 如果Cygwin可用,则可以通过指定Cygwin选项来比较纪元值 .

    我在美国东部时间,报告的差异是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
    
  • 10

    这是我的方法,没有转换,没有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
    
  • 2

    测量时间的替代方案只是“获取日期” . 你没有转发输出等麻烦 .

    $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
    

相关问题