Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time 执行批处理文件需要多长时间?_Time_Batch File_Executable - Fatal编程技术网

Time 执行批处理文件需要多长时间?

Time 执行批处理文件需要多长时间?,time,batch-file,executable,Time,Batch File,Executable,如何编写脚本来计算脚本完成所需的时间 我原以为会是这样,但显然不是 @echo off set starttime=%time% set endtime=%time% REM do stuff here set /a runtime=%endtime%-%starttime% echo Script took %runtime% to complete 您不能在批处理脚本中直接执行时间算术,因此您需要一个外部程序来计算时间差,或者提取时间的每一部分并以这种方式执行算术 请看下面的示例,了解

如何编写脚本来计算脚本完成所需的时间

我原以为会是这样,但显然不是

@echo off
set starttime=%time%
set endtime=%time%

REM do stuff here

set /a runtime=%endtime%-%starttime%
echo Script took %runtime% to complete

您不能在批处理脚本中直接执行时间算术,因此您需要一个外部程序来计算时间差,或者提取时间的每一部分并以这种方式执行算术

请看下面的示例,了解如何执行后者。摘录如下:

@echo off cls REM ================================================== ====== REM = Setting Date Time Format = REM ================================================== ====== set DT=%DATE% %TIME% set year=%DT:~10,4% set mth=%DT:~4,2% set date=%DT:~7,2% set hour=%DT:~15,2% set min=%DT:~18,2% set sec=%DT:~21,2% set newDT=%year%_%mth%_%date% %hour%%min%%sec% set hour=14 set min=10 REM =============================== REM = Getting End Time = REM =============================== set EndTime=%TIME% set EndHour=%EndTime:~0,2% set EndMin=%EndTime:~3,2% REM =============================== REM = Finding Difference = REM =============================== set /a Hour_Diff=EndHour - hour >nul set /a Min_Diff=EndMin - min >nul REM =============================== REM = Hour Hand Change? = REM =============================== IF [%Hour_Diff]==[0] ( Set Duration=%Min_Diff% ) ELSE ( Set /a Duration=60-%Min_Diff% >nul ) echo Start Time = %hour% : %min% echo End Time = %EndHour% : %EndMin% echo. echo Min Diff = %Min_Diff% echo. echo time difference (mins) = %Duration% @回音 cls REM================================================================================================ REM=设置日期时间格式= REM================================================================================================ 设置DT=%DATE%%TIME% 设定年份=%DT:~10,4% 设置mth=%DT:~4,2% 设置日期=%DT:~7,2% 设置小时=%DT:~15,2% 设置最小值=%DT:~18,2% 设置秒=%DT:~21,2% 设置新DT=%year%\uU%mth%\uU%date%%hour%%min%%秒% 设定小时=14 设置最小值=10 雷姆=============================== REM=获取结束时间= 雷姆=============================== 设置结束时间=%TIME% 设置EndHour=%EndTime:~0,2% set EndMin=%EndTime:~3,2% 雷姆=============================== REM=发现差异= 雷姆=============================== 设置/小时\u Diff=EndHour-Hour>num 设置/a最小值_差异=EndMin-Min>num 雷姆=============================== REM=时针变化= 雷姆=============================== 如果[%Hour_Diff]=[0]( 设置持续时间=%Min\u Diff% )否则( 设置/a持续时间=60-%Min\u Diff%>nul ) 回显开始时间=%hour%:%min% 回显结束时间=%EndHour%:%EndMin% 回声。 回波最小差异=%Min\u差异% 回声。 回波时差(分钟)=%持续时间%
我还假设这是一个输入错误,但您确实希望确保在处理后设置
endtime

我个人的偏好是安装Cygwin并使用
time
命令,但是,如果您实际上必须将其作为批处理文件来执行,则不能仅减去字符串,必须将其作为一部分来处理

下面的脚本将执行10秒的ping命令,该命令能够跨越一天的边界,而不会被负数所束缚。轻微的增强将允许它跨越许多天的界限

@echo off
setlocal enableextensions enabledelayedexpansion
set starttime=%time%
ping -n 11 127.0.0.1 >nul: 2>nul:
set endtime=%time%

set /a hrs=%endtime:~0,2%
set /a hrs=%hrs%-%starttime:~0,2%

set /a mins=%endtime:~3,2%
set /a mins=%mins%-%starttime:~3,2%

set /a secs=%endtime:~6,2%
set /a secs=%secs%-%starttime:~6,2%

if %secs% lss 0 (
    set /a secs=!secs!+60
    set /a mins=!mins!-1
)
if %mins% lss 0 (
    set /a mins=!mins!+60
    set /a hrs=!hrs!-1
)
if %hrs% lss 0 (
    set /a hrs=!hrs!+24
)
set /a tot=%secs%+%mins%*60+%hrs%*3600

echo End     = %endtime%
echo Start   = %starttime%
echo Hours   = %hrs%
echo Minutes = %mins%
echo Seconds = %secs%
echo Total   = %tot%

endlocal

这是一种切点,但它可能会帮助你

Microsoft有一个timeit.exe程序,其工作原理或多或少类似于unix“time”命令的增强版本。它出现了,它几乎取代了我一直想做的事情,就像你建议的那样


它可能值得一看。

关于原始批处理文件,有两件事跃然纸上。但从长远来看,两者都没有帮助

  • 无论使用什么基准测试方法,都要确保捕获操作前的开始时间和操作后的结束时间。你的样品不能做到这一点

  • %time%
    的计算结果类似于“12:34:56.78”,而
    SET/A
    命令无法减去这些值。您需要一个生成简单标量时间戳的命令

  • 我想说这是不可能做到的,但是批处理语言比它的功能强大得多,所以这里是TIMER.BAT的一个简单实现。为了记录在案,帕克斯击败了我,给出了一个答案,显示了我在摆弄时的字符串分裂,约翰内斯·勒塞尔建议将算术移到测量区域之外:

    @echo off
    setlocal
    
    rem Remeber start time. Note that we don't look at the date, so this
    rem calculation won't work right if the program run spans local midnight.
    set t0=%time: =0%
    
    rem do something here.... but probably with more care about quoting.
    rem specifically, odd things will happen if any arguments contain 
    rem precent signs or carets and there may be no way to prevent it.
    %*
    
    rem Capture the end time before doing anything else
    set t=%time: =0%
    
    rem make t0 into a scaler in 100ths of a second, being careful not 
    rem to let SET/A misinterpret 08 and 09 as octal
    set /a h=1%t0:~0,2%-100
    set /a m=1%t0:~3,2%-100
    set /a s=1%t0:~6,2%-100
    set /a c=1%t0:~9,2%-100
    set /a starttime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
    
    rem make t into a scaler in 100ths of a second
    set /a h=1%t:~0,2%-100
    set /a m=1%t:~3,2%-100
    set /a s=1%t:~6,2%-100
    set /a c=1%t:~9,2%-100
    set /a endtime = %h% * 360000 + %m% * 6000 + 100 * %s% + %c%
    
    rem runtime in 100ths is now just end - start
    set /a runtime = %endtime% - %starttime%
    set runtime = %s%.%c%
    
    echo Started at %t0%
    echo Ran for %runtime%0 ms
    
    你可以简化算法,不必费心第二部分的百分之一百,就可以更诚实地看待这个问题的整体准确性。假设您有一个sleep命令或其他一些浪费时间的命令,那么它正在运行:

    C:> TIMER SLEEP 3
    Script took 3000 ms to complete
    C:> 
    
    编辑:我按照评论中的建议修改了代码及其说明

    我认为,当NT团队用CMD.EXE替换COMMAND.COM时,他们认为他们不会轻易改变它。但实际上,它几乎是一种全新的语言。如果启用了扩展,许多旧的常用命令都具有新功能

    其中之一是
    SETLOCAL
    ,它防止变量修改调用者的环境。另一个是
    SET/A
    ,它为您提供了大量的算术知识。我在这里使用的主要技巧是新的子字符串提取语法,其中
    %t:~3,2%
    表示名为
    t
    的变量值中从偏移量3开始的两个字符

    真正令人震惊的是,请查看set的完整描述(在提示下尝试
    set/?
    ),如果这不会吓到您,请查看
    For/?
    ,注意它可以解析文件中的文本

    编辑2:修复了Frankie在评论中报告的对包含
    08
    09
    的时间字段的错误处理。调整了一些东西,并添加了一些评论

    请注意,这里有一个明显的疏忽,我可能不会纠正。如果命令的开始日期与结束日期不同,则该命令将不起作用。也就是说,它会做一些与一天中的时间相关的数学运算,并报告一个差异,但这个差异并不意味着什么

    修复它以至少警告这个案例是很容易的。修复它以做正确的事情更难


    编辑3:修复了%h%未正确设置为一位数小时的错误。这是由于%time%返回“9:01:23.45”。注意空格。使用%time:=0%将空格替换为前导零,并且将正确设置%h%。此错误仅在脚本从一个一位数的小时运行到下一个一位数的小时时发生。

    请检查此脚本,它将通过WMI检索时间,因此它与区域设置无关

    @echo off
    ::::::::::::::::::::::::::::::::::::::::::
    ::  TimeDiff v1.00 by LEVENTE ROG       ::
    ::       www.thesysadminhimself.com     ::
    ::::::::::::::::::::::::::::::::::::::::::
     
    ::[ EULA ]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    ::  Feel free to use this script. The code can be redistributed  ::
    ::  and edited, but please keep the credits.                     ::
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
     
    ::[ CHANGELOG ]::::::::::::::
    ::  v1.00 - First Version  ::
    :::::::::::::::::::::::::::::
     
     
    FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
     set Milisecond=%time:~9,2% 
     set Day=%%A
     set Hour=%%B
     set Minute=%%C
     set Second=%%D
    )
    set /a Start=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond%
     
    ::
    ::
    :: PUT COMMANDS HERE
    ping www.thesysadminhimself.com
    ::
    ::
     
    FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Second /Format:table ^| findstr /r "."') DO (
     set Day=%%A
     set Hour=%%B
     set Minute=%%C
     set Second=%%D
    )
    set Milisecond=%time:~9,2% 
    set /a End=%Day%*8640000+%Hour%*360000+%Minute%*6000+%Second%*100+%Milisecond%
    set /a Diff=%End%-%Start%
    set /a DiffMS=%Diff%%%100
    set /a Diff=(%Diff%-%DiffMS%)/100
    set /a DiffSec=%Diff%%%60
    set /a Diff=(%Diff%-%Diff%%%60)/60
    set /a DiffMin=%Diff%%%60
    set /a Diff=(%Diff%-%Diff%%%60)/60
    set /a DiffHrs=%Diff%
     
    :: format with leading zeroes
    if %DiffMS% LSS 10 set DiffMS=0%DiffMS!%
    if %DiffSec% LSS 10 set DiffMS=0%DiffSec%
    if %DiffMin% LSS 10 set DiffMS=0%DiffMin%
    if %DiffHrs% LSS 10 set DiffMS=0%DiffHrs%
     
    echo %DiffHrs%:%DiffMin%:%DiffSec%.%DiffMS%
    

    出色的小程序。但是,如果计算跨越两天,则计算不正确。 结果需要从24小时(8640000厘米秒)中减去

    同时删除相关行中的一个重复“set”命令

    请注意,区域设置会影响时间函数的格式,十进制在英国是一个句号,而不是逗号

    台词

    rem我们可以测量两天之间的时间

    if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%
    
    需要换成

    我们可能已经测量过时间了
    if %ENDTIME% LSS %STARTTIME% set /A DURATION=8640000 - (%STARTTIME% - %ENDTIME%)