延迟一段时间再执行下一条命令”。
一、利用ping实现延迟命令
这种延时手段是不精确的,因为每一次ping通的延迟不一样。
1、示例
chcp 65001 @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实现延时
添加参数/l,然后设置start、step、end分别为1、1、n,通过调整变量n的数值大小,就可以改变延时长短。
这个延时,也是不精确的。
1、示例
chcp 65001 @echo off echo 延时前:%time% for /l %%i in (1,1,100000) do echo %%i>nul echo 延时后:%time% pause
在bat文件中执行,结果如下,10万次对应大概20s的延时。
三、利用goto循环实现对精确延时
实现原理:
用户给出延时时间T,在进入延时循环之前记一次当前时间t1,而后执行到循环最后一句时再记一次当前时间t2;如果通过if命令语句判断出来T大于t2和t1的差值,就借goto命令语句再次进入循环,而如果判断出来小于差值,就用goto :eof命令退出循环。
1、代码示例(不调用子程序),在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毫秒。
2、下面再给出一个需要调用子程序的延时代码,实现原理和上面的一样。
@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