【批处理DOS-CMD命令-汇总和小结】-时间延迟命令、延迟执行命令——ping、for、vbs延迟函数、批处理命令

参考来源:bat脚本的基本命令语法 - 整合侠 - 博客园

一、什么是时间延迟命令、延迟执行命令?应用有哪些?

通俗来说,就是指“延迟一段时间再执行下一条命令”。

应用方面,主要是用来“模拟进度条”。

二、利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值