• bat延时


    1、暂停(Pause)、延迟(Delay)、等待(Wait)、睡眠(Sleep)
    1)for+set+if,时间精度为0.01秒,适用平台为WinNT/2K/XP/2003。
       利用for解析变量%time%并存为两个时间点%start%和%now%,再利用set /a计算两个时间点的时间差,最后用if判断时间差是否达到设定的暂停时间。
           @echo off
           setlocal enableextensions
           echo %time%
           call :ProcDelay 200
           echo %time%
           goto :EOF
           :ProcDelay delayMSec_
           setlocal enableextensions
           for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set start_=%%h%%i%%j%%k
           :_procwaitloop
           for /f "tokens=1-4 delims=:. " %%h in ("%time%") do set now_=%%h%%i%%j%%k
           set /a diff_=%now_%-%start_%
           if %diff_% LSS %1 goto _procwaitloop
           endlocal & goto :EOF
    2)VBS脚本中的sleep函数,时间精度为0.001秒,使用平台为Win9x/WinNT系列。
       动态创建一个调用sleep()函数的VBS脚本,然后用Windows脚本宿主的命令行版本cscript调用它。
           @echo off & setlocal enableextensions enabledelayedexpansion
           echo WScript.Sleep 2000 > %temp%\tmp$$$.vbs
           echo %time%
           cscript //nologo %temp%\tmp$$$.vbs
           echo %time%
           for %%f in (%temp%\tmp$$$.vbs) do if exist %%f del %%f
           endlocal & goto :EOF
    3)ping的消息发送间隔,时间精度为1秒,使用平台为Win9x/WinNT系列。
       需要你的Windows系统中正常安装了网卡的TCP/IP协议,有两种方案:
       (1) 利用ping两次发送消息之间的间隔时间。ping在发送多个消息时,在得到上一次消息的回应后,它会再等待1秒的时间才发送下一次消息,而这个回应时间因机型、系统和网络配置而不同,其中IP地址尤其关键,只有本地的回送地址 127.0.0.1 因为是立即回应所以才是相对恒定的,其他地址大多会产生显著的差异。此种方法要等待更大的时间,是指定发送的消息数为等待的时间加一,因为第一个消息是不等待的,IP 地址必须是 127.0.0.1 。其等待2秒的程序如下:
        ::根据植树原则,n后的数字为暂停秒数加一
        ping -n 3 127.0.0.1>nul
       (2) 利用ping的最大等待时间。ping向0.0.0.1发送一次“网际消息控制协议 (ICMP)”回响请求消息,因为 0.0.0.1 是个无法响应 ping 请求的IP地址,所以默认情况下,ping会等待一定的最大响应时间——4秒后便停止等待,而-w可以改变这个每发送一次消息所等待的最大响应时间。而如果将 IP 地址改为立即响应的127.0.0.1或其他响应时间很短的IP ,那 -w 便失去了作用,因为每次发送等待时间都不会达到最大的响应时间,此时延时会缩短。此种方法要等待更大的时间,可以直接使用 -w 指定,但是需要减去 500 毫秒(原因尚未知),而且 IP 地址必须是不响应请求的地址。其等待2秒的程序如下:
        ping -n 2 -w 500 0.0.0.1>nul
    4)choice的缺省选择等待功能,时间精度为1秒,适用平台为MS-DOS/Win9x/WinNT系列。
       /t:y,2 将缺省选择字符设置为y,等待时间是2秒,/n禁止[y,n]提示出现在命令行上,“rem|”的作用是禁止choice从键盘接受按键,从而暂停不会因为按下y或者其它键而被意外终止。
        rem|choice /t:y,2 /n >nul
    5)ASCII汇编代码,延迟精度为0.001秒,适用平台为MS-DOS/Win9x/WinNT。
       德国人Herbert Kleebauer给出了一个通用方案,通过ASCII汇编器间接产生一个sleep.exe程序来实现延迟,这个程序分为DOS和Win两个模块,分别调用DOS系统中断服务和WindowsAPI。
        :: Sleep.bat - Sleep/Delay/Wait n seconds
        :: Herbert Kleebauer(Germany) - 2005/05/29
        :: Modified by Will Sort - 2005/06/02, 07-25
        @echo off
        echo q | debug>nul
        echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sleep.com
        echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>sleep.com
        echo T}{z~~@GwkBG@OEKcUt`~}@MqqBsy?seHB~_Phxr?@zAB`LrPEyoDt@Cj?>>sleep.com
        echo pky_jN@QEKpEt@ij?jySjN@REKpEt@jj?jyGjN@SEKkjtlGuNw?p@pjirz>>sleep.com
        echo LFvAURQ?OYLTQ@@?~QCoOL~RDU@?aU?@{QOq?@}IKuNWpe~FpeQFwH?Vkk>>sleep.com
        echo _GSqoCvH{OjeOSeIQRmA@KnEFB?p??mcjNne~B?M??QhetLBgBPHexh@e=>>sleep.com
        echo EsOgwTLbLK?sFU`?LDOD@@K@xO?SUudA?_FKJ@N?KD@?UA??O}HCQOQ??R>>sleep.com
        echo _OQOL?CLA?CEU?_FU?UAQ?UBD?LOC?ORO?UOL?UOD?OOI?UgL?LOR@YUO?>>sleep.com
        echo dsmSQswDOR[BQAQ?LUA?_L_oUNUScLOOuLOODUO?UOE@OwH?UOQ?DJTSDM>>sleep.com
        echo QTqrK@kcmSULkPcLOOuLOOFUO?hwDTqOsTdbnTQrrDsdFTlnBTm`lThKcT>>sleep.com
        echo @dmTkRQSoddTT~?K?OCOQp?o??Gds?wOw?PGAtaCHQvNntQv_w?A?it\EH>>sleep.com
        echo {zpQpKGk?Jbs?FqokOH{T?jPvP@IQBDFAN?OHROL?Kj??pd~aN?OHROd?G>>sleep.com
        echo Q??PGT~B??OC~?ipO?T?~U?p~cUo0x>>sleep.com
        sleep.com>sleep.exe
        echo wait %1 seconds:
        sleep.exe %1000
        del sleep.com
        del sleep.exe


    批处理延时方法小结:
    1.ping
        @echo off
        :loop
        echo %time%
        ping 127.1 -n 2 1>nul
        echo %time%
        goto loop
    内存使用: cmd.exe   1704k     ping.exe   2920k
    误差评定: 较高
    优点:代码构造简单
    缺点:内存占用高,延迟时间长的话误差相对较大。

    2.还是ping
        @echo off
        :loop
        echo %time%
        ping 1 -n 1 -w 1000 2>nul 1>nul
        echo %time%
        goto loop
    内存使用:cmd.exe   1700k ping.exe   2912k
    误差评定:一般
    优点:代码构造简单,时间越长误差越小,精确度较高(50ms)
    缺点:内存占用高

    3.call
        @echo off
        :loop
        echo %time%
        call :delay 1000
        echo %time%
        goto loop
        :delay
        set /a num=num + 1
        if %num% geq %1 (set num=) && goto :eof
        rem for /l %%i in (1,1,%1) do echo. >nul
        goto :eof
    内存使用:cmd.exe 1744k   [for语句方案]
    cmd.exe 1740k   [set+goto方案]
    误差评定:很高 (受CPU频率影响非常大,几乎无法准确把握全局延迟时间)
    优点:精确度较高
    缺点:不适合需精确把握时间的场合

    4.msg
        @echo off
        :loop
        echo %time%
        msg %username% /time:20 /w "正在延时,点确定可以取消延时!"
        echo %time%
        goto loop
    内存使用:cmd.exe 1752k msg.exe   2620k
    误差评定:低
    优点:比较稳定,可中途取消延时,代码构造简单
    缺点:内存占用非常大,有窗口弹出(优点?缺点?)

    5.vbs
        @echo off
        echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
        :loop
        echo %time%
        cscript //b //nologo %tmp%\delay.vbs 2000
        echo %time%
        goto loop
    内存使用:cscript.exe 4812k cmd.exe 1708k
    误差评定:很低
    优点:精确度最高,使用更灵活,方便
    缺点:产生临时文件,内存占用多
    End:
    1.测试条件有限,以上数据并不具备权威性。
    2.关于精确度。
    其实只要是参数可以指定时间的命令精确度都比较高,之所以受影响是取决与命令执行的次数,次数越多,精确度越低。而方案5[vbs方案]中之所以说它的精确度最高,可以举个例子: cscript //b //nologo delay.vbs 2036,而方案二由于最小精确度的缘故,还是比方案5要差一点。

    最终用到的bat精确延时命令 延时10秒(10000)
    @echo off
    echo Wscript.Sleep WScript.Arguments(0) >%tmp%\delay.vbs
    echo %time%
    cscript //b //nologo %tmp%\delay.vbs 10000
    echo %time%

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    有人给出的方法,感觉很一般了,也容易出现环境变量未置空情况

    :Delay
    set time_string=%TIME:.=:%

    if not defined delay_end (
    for /f "tokens=1-4 delims=:." %%i in ("%time_string::0=:%") do (
    set /a delay_end=^(%%i*3600+%%j*60+%%k^)*1000+%%l*10+%1))

    for /f "tokens=1-4 delims=:." %%i in ("%time_string::0=:%") do (
    set /a delay_now=^(^(%%i*3600+%%j*60+%%k^)*1000+%%l*10^))

    if %delay_now% LSS %delay_end% (
    goto :Delay)

    set time_string=
    set delay_start=
    set delay_end=
    exit /b 0

    一般方法,CPU使用率50%,还因为CPU是双核

  • 相关阅读:
    VS密钥
    继承中delelte对象子类析构函数不被执行
    [LeetCode] Merge k Sorted Lists
    [LeetCode] Spiral Matrix II
    [LeetCode] Multiply Strings
    [LeetCode] Valid Number
    [LeetCode] Search Insert Position
    [LeetCode] Spiral Matrix
    [LeetCode] Valid Parentheses
    [LeetCode] Rotate List
  • 原文地址:https://www.cnblogs.com/dongzhiquan/p/1994553.html
Copyright © 2020-2023  润新知