[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] [分享]发现一个系统内置的较精确的延时命令pathping

pathping [-n] [-h MaximumHops] [-g HostList] [-p Period] [-q NumQueries [-w Timeout] [-i IPAddress] [-4 IPv4] [-6 IPv6][TargetName]
参数
   -n   阻止 pathping 试图将中间路由器的 IP 地址解析为各自的名称。这有可能加快 pathping 的结果显示。
  -h MaximumHops   指定搜索目标(目的)的路径中存在的跃点的最大数。默认值为 30 个跃点。
  -g HostList   指定回响请求消息利用 HostList 中指定的中间目标集在 IP 数据头中使用“稀疏来源路由”选项。使用稀疏来源路由时,相邻的中间目标可以由一个或多个路由器分隔开。HostList 中的地址或名称的最大数为 9。HostList 是一系列由空格分隔的 IP 地址(用带点的十进制符号表示)。
  -p Period   指定两个连续的 ping 之间的时间间隔(以毫秒为单位)。默认值为 250 毫秒(1/4 秒)。
  -q NumQueries   指定发送到路径中每个路由器的回响请求消息数。默认值为 100 个查询。
  -w Timeout   指定等待每个应答的时间(以毫秒为单位)。默认值为 3000 毫秒(3 秒)。
  -i IPAddress   指定源地址。   -4 IPv4   指定 pathping 只使用 IPv4。
  -6 IPv6   指定 pathping 只使用 IPv6。
  TargetName   指定目的端,它既可以是 IP 地址,也可以是主机名。




通过上面命令说明,那么构造如下命令
  1. pathping -n -h 1 -q 1 -p 300 127.0.0.1 >nul
复制代码
-n 阻止解析,加快显示。
-h 1 因为是ping自己,所以跃点数1。
-q 1 就是只发送一个数据包
-p 300 即延迟300毫秒

当-p 值为1毫秒时,我这里运行耗费时间大约是60-100ms之间,并且大部分时间为80-90ms。
-p 值较大时,运行的时间仍然大约是 p值+60-100ms。

所以这个命令的精确度大约是50ms左右,并且最低计时时间可以看成是100ms。

[ 本帖最后由 caruko 于 2011-1-3 00:42 编辑 ]
1

评分人数

LZ的这个却实是没见过.只能说对P还不了解.以下是小弟学习中查到的,分享一下
  1. @echo off
  2. set /p delay=请输入需延迟的毫秒数:
  3. set TotalTime=0
  4. set NowTime=%time%
  5. ::读取起始时间,时间格式为:13:01:05.95
  6. echo 程序开始时间:%NowTime%
  7. :delay_continue
  8. set /a minute1=1%NowTime:~3,2%-100
  9. ::读取起始时间的分钟数
  10. set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  11. ::将起始时间的秒数转为毫秒
  12. set NowTime=%time%
  13. set /a minute2=1%NowTime:~3,2%-100
  14. :: 读取现在时间的分钟数
  15. set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
  16. ::将现在时间的秒数转为毫秒
  17. set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
  18. if %TotalTime% lss %delay% goto delay_continue
  19. echo 程序结束时间:%time%
  20. echo 设定延迟时间:%delay%毫秒
  21. echo 实际延迟时间:%TotalTime%毫秒
  22. pause
复制代码
实现原理:首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。

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

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1 1 20) do (
  4. set time1=!time!
  5. pathping -n -h 1 -q 1 -p 15 127.0.0.1 >nul
  6. echo !time1!---^>!time!
  7. )
复制代码
下面是运行结果:
0:45:33.29---> 0:45:33.37
0:45:33.37---> 0:45:33.46
0:45:33.46---> 0:45:33.56
0:45:33.56---> 0:45:33.64
0:45:33.64---> 0:45:33.73
0:45:33.73---> 0:45:33.81
0:45:33.81---> 0:45:33.90
0:45:33.90---> 0:45:33.98
0:45:33.98---> 0:45:34.07
0:45:34.07---> 0:45:34.15
0:45:34.15---> 0:45:34.25
0:45:34.25---> 0:45:34.32
0:45:34.32---> 0:45:34.42
0:45:34.42---> 0:45:34.50
0:45:34.50---> 0:45:34.59
0:45:34.59---> 0:45:34.68
0:45:34.68---> 0:45:34.76
0:45:34.76---> 0:45:34.85
0:45:34.85---> 0:45:34.93
0:45:34.93---> 0:45:35.03

TOP

原帖由 wc726842270 于 2011-1-3 00:44 发表
LZ的这个却实是没见过.只能说对P还不了解.以下是小弟学习中查到的,分享一下@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo ...


你这个需要大量的CPU占用...
而不是能将进程阻塞,CPU闲置等待结果的好方式。

这也是为什么很多人用ping -n 1 127.1>nul 来延时的原因。
而如果使用choice跟MSG延时,只能精确到秒。

[ 本帖最后由 caruko 于 2011-1-3 00:58 编辑 ]

TOP

回复 4楼 的帖子

呵呵,这个倒没想过,因为在网吧.说实话也不懂.本人一直以来都用CHOICE和ping来延时的.2L仅是一个思路,至于延时么,我都不用(关键太长,写起来很麻烦)

TOP

返回列表