一、什么是时间延迟命令、延迟执行命令?应用有哪些?
通俗来说,就是指“延迟一段时间再执行下一条命令”。
应用方面,主要是用来“模拟进度条”。
二、利用ping实现延迟命令
为啥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实现延时
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的延时。
四、利用vbs延迟函数实现延时
实现原理:
将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毫秒之内,属于正常延时发挥。
五、利用goto循环实现对精确延时
实现原理:
用户给出延时时间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