赞
踩
通俗来说,就是指“延迟一段时间再执行下一条命令”。
应用方面,主要是用来“模拟进度条”。
为啥ping命令可以实现延时?
因为从我们自己的主机Ping通到目标主机,是需要时间的;所以执行ping命令一般比较久,利用它执行很久的特性,额外加在想要延时的位置,就实现了延时命令。
但是这种延时手段是不精确的,因为每一次ping通的延迟不一样。
下面给出一个ping命令延时的例程。
- @echo off
- echo 延时前:%time%
- ping /n 3 127.0.0.1 >nul
- echo 延时后:%time%
- pause
参数/n表示ping通的次数。
127.0.0.1是本机ip地址,在这里可以简写成127.1。
>nul表示不将结果显示在屏幕上。
在Bat文件中执行,效果如下,可以看到延时了2秒钟。
for命令实现延时的原理,也很简单。
直接添加参数/l,然后设置start、step、end分别为1、1、n,通过调整变量n的数值大小,就可以改变延时长短。
这个延时,也是不精确的。
下面给出bat代码。同样地,>nul也是用来屏蔽计次循环的输出内容。
- @echo off
- echo 延时前:%time%
- for /l %%i in (1,1,100000) do echo %%i>nul
- echo 延时后:%time%
- pause
在bat文件中执行,结果如下,10万次对应大概2s的延时。
实现原理:
将wscript.sleep延时方法的代码放入临时创建的delay.vbs脚本文件,而后利用cmd命令cscript调用delay.vbs脚本文件,即可实现延时。
延时误差:
精确度毫秒,误差1000毫秒,
代码如下:
- @echo off
- echo %time%
- call :delay 5000
- echo %time%
- pause
-
- exit
- :delay
- echo WScript.Sleep %1>delay.vbs
- CScript //B delay.vbs
- del delay.vbs
- goto :eof
WScript.Sleep方法有两种语法,既可以是【WScript.Sleep xxx】,也可是【WScript.Sleep(xxx)】,其中xxx代表延时毫秒数。
上面的【CScript //B delay.vbs】,也可以写成【CScript /B delay.vbs】,最后都能实现启动脚本文件的功能。
另外,如果直接双击执行Bat文件时提示拒绝访问,就以管理员身份运行。
执行结果如下,延时5.05秒,多出来的50毫秒大概更多是建立和删除临时脚本文件所用的时间,在1000毫秒之内,属于正常延时发挥。
实现原理:
用户给出延时时间T,在进入延时循环之前记一次当前时间t1,而后执行到循环最后一句时再记一次当前时间t2;如果通过if命令语句判断出来T大于t2和t1的差值,就借goto命令语句再次进入循环,而如果判断出来小于差值,就用goto :eof命令退出循环。
代码示例(不调用子程序),在bat脚本中执行下面的代码:
- @echo off
- chcp 65001
- set /p delay=请输入需延迟的毫秒数:
- set TotalTime=0
- set NowTime=%time%
- ::读取起始时间,时间格式为:13:01:05.95
- echo 程序开始时间:%NowTime%
- :delay_continue
- set /a minute1=1%NowTime:~3,2%-100
- ::读取起始时间的分钟数
- set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- ::将起始时间的秒数转为毫秒
- set NowTime=%time%
- set /a minute2=1%NowTime:~3,2%-100
- :: 读取现在时间的分钟数
- set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- ::将现在时间的秒数转为毫秒
- set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
- if %TotalTime% lss %delay% goto delay_continue
- echo 程序结束时间:%time%
- echo 设定延迟时间:%delay%毫秒
- echo 实际延迟时间:%TotalTime%毫秒
- pause
回车执行后,提示输入延迟毫秒数,下图中的黄圈就是手动输入的。
很显然,最后的实际延迟时间和设定延迟时间完全一样,精确无误。
延时精度:
windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。
下面再给出一个需要调用子程序的延时代码,实现原理和上面的一样。
- @echo off
- echo 程序开始时间:%Time%
- call :delay 10
- echo 实际延迟时间:%totaltime%毫秒
- echo 程序结束时间:%time%
- pause
- exit
-
- ::-----------以下为延时子程序--------------------
- :delay
- @echo off
- if "%1"=="" goto :eof
- set DelayTime=%1
- set TotalTime=0
- set NowTime=%time%
- ::读取起始时间,时间格式为:13:01:05.95
- :delay_continue
- set /a minute1=1%NowTime:~3,2%-100
- set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- set NowTime=%time%
- set /a minute2=1%NowTime:~3,2%-100
- set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
- set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
- if %TotalTime% lss %DelayTime% goto delay_continue
- goto :eof
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。