找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23294|回复: 4

[日期时间] [分享]批处理延时

[复制链接]
发表于 2012-4-17 00:19:04 | 显示全部楼层 |阅读模式
今日偶尔看到某牛写的一本《批处理编程教程》,没想到批处理竟然可以折腾出这么多花样来。其中关于延时问题介绍得不太详细,本着“百度一下,你就甚么都明白了”的精神,俺百度了一下,结果发现这问题果然有很多解。总的来说大概有:
1.用ping
2.用vbs(cscript, wscript)
3.用choice(xp之后已不可用)
4.用mshta
5.用msg
  这些方法各有优缺点。俺一时手痒,也写了一段延迟程序,没用甚么奇巧淫技,只用了内部命令,误差在10ms以内,但CPU占用率相当高,代码如下:
  1. @rem 批处理延迟子程序(注:最多延时不超过24小时)
  2. @echo off

  3. rem 设置变量延迟
  4. setlocal enabledelayedexpansion

  5. :delay
  6. if x%1==x (
  7.     echo 用法:delay xxxx
  8.     echo 其中:xxxx为需要延迟的毫秒数
  9.     echo.
  10.     echo 例如延迟5秒:delay 5000
  11.     goto end
  12. )

  13. set /a delta=%1
  14. set t0=%time%
  15. echo 开始时间:%t0%
  16. set st=%t0:~0,1%

  17. rem 检查当前时间第1位是否为空格
  18. if not defined st (
  19.     set /a hour=%t0:~1,1%
  20. ) else (
  21.     set /a hour=%t0:~0,2%
  22. )
  23. set /a min=1%t0:~3,2%-100
  24. set /a sec=1%t0:~6,2%-100
  25. set /a ms=(1%t0:~9,2%-100)*10

  26. rem N0存放初始时间(以毫秒为单位)
  27. set /a N0=ms+sec*1000+min*60*1000+hour*60*60*1000

  28. rem 开始折腾,折腾一次不超过2ms,但time的精度为10ms,所以本程序的精度不超过10ms
  29. :loop
  30. set t0=%time%
  31. set st=%t0:~0,1%

  32. rem 检查当前时间第1位是否为空格
  33. if not defined st (
  34.     set /a hour1=%t0:~1,1%
  35. ) else (
  36.     set /a hour1=%t0:~0,2%
  37. )
  38. if hour1 lss hour (
  39.     set /a hour=24+hour1
  40. ) else (
  41.     set /a hour=hour1
  42. )
  43. set /a min=1%t0:~3,2%-100
  44. set /a sec=1%t0:~6,2%-100
  45. set /a ms=(1%t0:~9,2%-100)*10

  46. rem N2存放当前时间(以毫秒为单位)
  47. set /a N2=ms+sec*1000+min*60*1000+hour*60*60*1000

  48. rem deltax为当前时间与初始时间之差(以毫秒为单位)
  49. set /a deltax=N2-N0

  50. if %deltax% lss %delta% goto loop

  51. echo 结束时间:%time%

  52. rem 作为一个单独批处理程序时,可以不要以下语句
  53. goto :eof

  54. rem 程序结束处标记
  55. :end
复制代码
发表于 2012-4-17 06:23:35 | 显示全部楼层
 楼主| 发表于 2012-4-17 09:26:12 | 显示全部楼层
本帖最后由 jet9600 于 2012-4-17 09:28 编辑
gawk 发表于 2012-4-17 06:23


呵呵,没想到跟这里某些程序的思路是一样的,不过稍微看了一下,貌似有些程序很明显有BUG,在跨越小时(分钟等)时会有问题。
当时俺还想过调用kernel32中的Sleep,试了一下rundll32,没成功,就没管它了
发表于 2012-4-17 18:34:15 | 显示全部楼层
回复 3# jet9600


    可能某些在某些场合不需要考虑跨太长时间
发表于 2012-4-17 18:35:43 | 显示全部楼层
用choice(xp之后已不可用)

这个值得商榷啊,XP系统确实没有自带choice.exe,但是你真的测试过这些系统吗:
Win2003
Vista
Win2008
Win7
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 02:09 , Processed in 0.018216 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表