当前位置:   article > 正文

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

cmd延时执行命令

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

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

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

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

二、利用ping实现延迟命令

为啥ping命令可以实现延时?

因为从我们自己的主机Ping通到目标主机,是需要时间的;所以执行ping命令一般比较久,利用它执行很久的特性,额外加在想要延时的位置,就实现了延时命令。

但是这种延时手段是不精确的,因为每一次ping通的延迟不一样。

下面给出一个ping命令延时的例程。

  1. @echo off
  2. echo 延时前:%time%
  3. ping /n 3 127.0.0.1 >nul
  4. echo 延时后:%time%
  5. 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也是用来屏蔽计次循环的输出内容。

  1. @echo off
  2. echo 延时前:%time%
  3. for /l %%i in (1,1,100000) do echo %%i>nul
  4. echo 延时后:%time%
  5. pause

在bat文件中执行,结果如下,10万次对应大概2s的延时。

 

四、利用vbs延迟函数实现延时

实现原理:

将wscript.sleep延时方法的代码放入临时创建的delay.vbs脚本文件,而后利用cmd命令cscript调用delay.vbs脚本文件,即可实现延时。

延时误差:

精确度毫秒,误差1000毫秒,

代码如下:

  1. @echo off
  2. echo %time%
  3. call :delay 5000
  4. echo %time%
  5. pause
  6. exit
  7. :delay
  8. echo WScript.Sleep %1>delay.vbs
  9. CScript //B delay.vbs
  10. del delay.vbs
  11. 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脚本中执行下面的代码:

  1. @echo off
  2. chcp 65001
  3. set /p delay=请输入需延迟的毫秒数:
  4. set TotalTime=0
  5. set NowTime=%time%
  6. ::读取起始时间,时间格式为:13:01:05.95
  7. echo 程序开始时间:%NowTime%
  8. :delay_continue
  9. set /a minute1=1%NowTime:~3,2%-100
  10. ::读取起始时间的分钟数
  11. set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  12. ::将起始时间的秒数转为毫秒
  13. set NowTime=%time%
  14. set /a minute2=1%NowTime:~3,2%-100
  15. :: 读取现在时间的分钟数
  16. set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  17. ::将现在时间的秒数转为毫秒
  18. set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
  19. if %TotalTime% lss %delay% goto delay_continue
  20. echo 程序结束时间:%time%
  21. echo 设定延迟时间:%delay%毫秒
  22. echo 实际延迟时间:%TotalTime%毫秒
  23. pause

 回车执行后,提示输入延迟毫秒数,下图中的黄圈就是手动输入的。

很显然,最后的实际延迟时间和设定延迟时间完全一样,精确无误。 

延时精度:

windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

下面再给出一个需要调用子程序的延时代码,实现原理和上面的一样。

  1. @echo off
  2. echo 程序开始时间:%Time%
  3. call :delay 10
  4. echo 实际延迟时间:%totaltime%毫秒
  5. echo 程序结束时间:%time%
  6. pause
  7. exit
  8. ::-----------以下为延时子程序--------------------
  9. :delay
  10. @echo off
  11. if "%1"=="" goto :eof
  12. set DelayTime=%1
  13. set TotalTime=0
  14. set NowTime=%time%
  15. ::读取起始时间,时间格式为:13:01:05.95
  16. :delay_continue
  17. set /a minute1=1%NowTime:~3,2%-100
  18. set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  19. set NowTime=%time%
  20. set /a minute2=1%NowTime:~3,2%-100
  21. set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  22. set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
  23. if %TotalTime% lss %DelayTime% goto delay_continue
  24. goto :eof

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号