Board logo

标题: [网络连接] [已处理]批处理如何检测N个IP的最少PING值后计算出最小值? [打印本页]

作者: missll    时间: 2011-5-4 23:56     标题: [已处理]批处理如何检测N个IP的最少PING值后计算出最小值?

本帖最后由 missll 于 2011-5-6 12:54 编辑

之前发过一个帖子询问 当时是直接检测PING值 有些不准确 所以另开帖提问,
目的: PING  N个IP输出到文本,检测平均times值最少的 然后执行拨号动作, 例如:
  1. Pinging 1.224.163.46 with 32 bytes of data:
  2. Reply from 1.224.163.46: bytes=32 time=406ms TTL=116
  3. Reply from 1.224.163.46: bytes=32 time=421ms TTL=116
  4. Reply from 1.224.163.46: bytes=32 time=405ms TTL=116
  5. Reply from 1.224.163.46: bytes=32 time=421ms TTL=116
  6. Ping statistics for 1.224.163.46:
  7.     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
  8. Approximate round trip times in milli-seconds:
  9.     Minimum = 405ms, Maximum = 421ms, Average = 413ms
  10. Pinging 121.78.237.45 with 32 bytes of data:
  11. Reply from 121.78.237.45: bytes=32 time=326ms TTL=114
  12. Reply from 121.78.237.45: bytes=32 time=297ms TTL=114
  13. Reply from 121.78.237.45: bytes=32 time=296ms TTL=114
  14. Reply from 121.78.237.45: bytes=32 time=327ms TTL=114
  15. Ping statistics for 121.78.237.45:
  16.     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
  17. Approximate round trip times in milli-seconds:
  18.     Minimum = 296ms, Maximum = 327ms, Average = 311ms
  19. Pinging 222.236.47.239 with 32 bytes of data:
  20. Reply from 222.236.47.239: bytes=32 time=383ms TTL=118
  21. Reply from 222.236.47.239: bytes=32 time=406ms TTL=118
  22. Reply from 222.236.47.239: bytes=32 time=390ms TTL=118
  23. Reply from 222.236.47.239: bytes=32 time=374ms TTL=118
  24. Ping statistics for 222.236.47.239:
  25.     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
  26. Approximate round trip times in milli-seconds:
  27.     Minimum = 374ms, Maximum = 406ms, Average = 388ms
复制代码
以上三个IP中 time最少的平均值是121.78.237.45,然后执行 rasdial.exe 121.78.237.45 name pass 来拨号连接。

之间的批处理是这样写的:
  1. @echo off
  2. ::--------------------------------
  3. ping 1.224.163.46 -n 1 >>%TEMP%\ip.txt
  4. ping 121.78.237.45 -n 1 >>%TEMP%\ip.txt
  5. ping 222.236.47.239 -n 1 >>%TEMP%\ip.txt
  6. ::--------------------------------
  7. if exist %TEMP%\ip.txt (for /f "tokens=1,3,8 delims=m:=<> " %%a in (%TEMP%\ip.txt) do if /i "%%a"=="Reply" echo %%b=%%c
  8. ) else (echo not found %TEMP%\ip.txt)
  9. del /q %TEMP%\ip.txt
  10. pause
复制代码
它的缺点是 只PING了一个 不能更准确的显示平均时间, 因为只在含有“Reply”中寻找 用for /f 取出IP地址来
但是如果检测平均值 含有Average 字样的行没有IP 所以我不知道怎么显示了. 并且只是显示所有的PING值 我自己看哪个最少来手动拨号的.

如何取出这些平均值后如何逐步计算 一直到找出最小的呢? 以上是PING了3个,如果更多的时候怎么写. 请指点...
作者: hfg1977    时间: 2011-5-5 02:19

  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. for /f "tokens=* usebackq delims=" %%a in ("IP_list.txt") do (
  4. echo ping %%a ......
  5. for /f "tokens=6 delims= = " %%A in ('ping %%a 2^>nul^|findstr /i "Average"') do (
  6. set _time=%%~nxA
  7. set _time=!_time:ms=!
  8. set _time=!_time:~,-1!
  9. if not defined min (set min=!_time!&set _IP=%%a)
  10. if !_time! lss !min! (set min=!_time!&set _IP=%%a)
  11. echo min=!min!
  12. echo.
  13. ))
  14. echo min=%min%  IP=%_IP%
复制代码

作者: missll    时间: 2011-5-5 05:55

谢谢你的回复 可是看起来运行并不正常 并且我需要得到TIME的最小值后做出一个拨号的动作
哪个IP的TIME值最小 就拨哪个IP地址


@echo off
setlocal enabledelayedexpansion&cls
for /f "tokens=* usebackq delims=" %%a in ("IP_list.txt") do (
echo ping %%a ......
for /f "tokens=6 delims=        = " %%A in ('ping %%a 2^>nul^|findstr / ...
hfg1977 发表于 2011-5-5 02:19

作者: jsbba    时间: 2011-5-5 08:00

hfg1977 写的是重点啊,拨号你自己加进去就好了撒,你试试他能不能提取最小值
作者: missll    时间: 2011-5-5 12:07

我当然试过了 运行出错。


ping 124.133.252.76 ......
此时不应有 = "。
ping 211.151.93.220 ......
此时不应有 = "。
min=  IP=



hfg1977 写的是重点啊,拨号你自己加进去就好了撒,你试试他能不能提取最小值
jsbba 发表于 2011-5-5 08:00

作者: hfg1977    时间: 2011-5-5 12:29

回复楼主:
我测试成功的,不然不会发出了.

这个错误的产生是由于code中的字符被更改造成:

for /f "tokens=6 delims=        = " %%A in ('ping %%a 2^>nul^|findstr /i "Average"') do (
其中 [delims=        = "] 由 TAB,等号,英文空格构成, TAB被更改成了数个空格符,你改过来就好了,其顺序不可更改.
作者: hanyeguxing    时间: 2011-5-5 13:40

本帖最后由 hanyeguxing 于 2011-5-6 08:20 编辑
  1. @echo off&setlocal enableDelayedExpansion&set a=:Hanyeguxing
  2. for /f "usebackq tokens=1-13 delims=Mm " %%X in ("输出.txt") do  (
  3.     if /i "%%X"=="Pinging" set b=%%Y
  4.     if /i "%%b"=="Average" if %%d lss !a:*:^=! set a=!b!:%%d
  5. )
  6. for /f "delims=:" %%a in ("%a%") do rasdial.exe %%a name pass
复制代码
或:
  1. @echo off&setlocal enableDelayedExpansion&set a=:Hanyeguxing
  2. for /f "usebackq delims=" %%i in ("ip列表.txt") do for /f "tokens=1-13 delims=Mm " %%X in ('ping %%i -n 1 -w 80') do  (
  3.     if /i "%%X"=="Pinging" set b=%%Y
  4.     if /i "%%b"=="Average" if %%d lss !a:*:^=! set a=!b!:%%d
  5. )
  6. for /f "delims=:" %%a in ("%a%") do rasdial.exe %%a name pass
复制代码

作者: Batcher    时间: 2011-5-5 21:42

参考:批处理自动获取最快速的QQ服务器
http://bbs.bathome.net/thread-4193-1-1.html
作者: missll    时间: 2011-5-6 12:50

感谢 测试可用  可以显示最小值 和IP  保存下来仔细再学习。
6# hfg1977
作者: missll    时间: 2011-5-6 12:53

非常感谢Hanyeguxing的回复 每次提问都能给予一个完美的答复 已保存 仔细学习。

@echo off&setlocal enableDelayedExpansion&set a=:Hanyeguxing
for /f "usebackq tokens=1-13 delims=Mm " %%X in ("输出.txt") do  (
    if /i "%%X"=="Pinging" set b=%%Y
    if /i "%%b"=="Average" if %% ...
hanyeguxing 发表于 2011-5-5 13:40

作者: missll    时间: 2011-5-6 12:54

感谢管理员 这篇文章我已看过 学习。

参考:批处理自动获取最快速的QQ服务器
http://bbs.bathome.net/thread-4193-1-1.html
Batcher 发表于 2011-5-5 21:42

作者: missll    时间: 2011-5-6 13:36

请教 hanyeguxing代码的问题
setlocal enableDelayedExpansion&set d=:Hanyeguxing
for /f "delims=" %%z in (ip.txt) do for /f "tokens=1,2,11,13 delims=Mm " %%a in ('ping %%z -n 1 -w 80') do  (
    if /i "%%a"=="Pinging" set b=%%b
    if /i "%%c"=="Average" if %%d lss !d:*:^=! set d=!b!:%%d
)
for /f "delims=:" %%a in ("%d%") do rasdial.exe %%a name pass
_____________________________________________________________
为什么开始就设置一个变量d? 看后边的代码没有理解.
  1. for /f "delims=" %%z in (ip.txt) do for /f "tokens=1,2,11,13 delims=Mm " %%a in ('ping %%z -n 1 -w 80') do  (
复制代码
这一行能明白 在ip.txt中取出IP地址来ping, (这里的-w 80延时是什么意思? 我看帮助ping /? 是timeout时间  但设置与不设置ping的结果是没有区别的.)
以 Mm空格 作为条件来截取1,2,11,13    4个节点.
  1. E:\>ping 1.224.163.46 -w 80
  2. Pinging 1.224.163.46 with 32 bytes of data:
  3. Request timed out.
  4. Reply from 1.224.163.46: bytes=32 time=296ms TTL=116
  5. Reply from 1.224.163.46: bytes=32 time=280ms TTL=116
  6. Reply from 1.224.163.46: bytes=32 time=296ms TTL=116
  7. Ping statistics for 1.224.163.46:
  8.     Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
  9. Approximate round trip times in milli-seconds:
  10.     Minimum = 280ms, Maximum = 296ms, Average = 290ms
复制代码
  1.     if /i "%%a"=="Pinging" set b=%%b
复制代码
如果%%a 等于 Pinging就把%%b的值赋给b ,也就是这一行.
Pinging 1.224.163.46 with 32 bytes of data:

但是下边一行什么意思我就没理解了.
    if /i "%%c"=="Average" if %%d lss !d:*:^=! set d=!b!:%%d
如果%%c等于Average  也就是这一行:
Minimum = 280ms, Maximum = 296ms, Average = 290ms
如果%%d (290)小于 !d:*:^=!   这里是什么意思? 没学过这个值是什么意思
还有后边set  d=    !b!:%%d
这里的!b!的哪个的值?   !b!:%%d  又是什么意思?

到最后,最开始设置的d变量似乎没用到?
作者: hanyeguxing    时间: 2011-5-6 18:09

1,-w是请求超时默认等待的4秒的设置值,如果确定都能ping 通则可以不用
2,set a=:Hanyeguxing 这里的初始d的值只要在 if 比较时比数字大就可以,所以可以为任意字母
3,ip获取来自Pinging ...这一行,即第一列为Pinging,第二列为ip,所以if /i "%%X"=="Pinging" set b=%%Y后b就为ip
4,    Minimum = 405ms, Maximum = 421ms, Average = 413ms 以M和m与空格分隔此行第11列为
Average,第13列为其值,即%%d。
如果ping 不通,则无此行,ip换新值,即b换新ip
如果ping同,且Average为第一次出现,则数值与Hanyeguxing比较必小于,a为此时“ip:数值”
如果Average不是第一次出现,则与a中数值比较,小于时set新的“ip:数值”
!a:*:^=! 即!a:*:=!即获取a的第一个:后所有内容,^用来转义=
作者: hanyeguxing    时间: 2011-5-6 18:14

本帖最后由 hanyeguxing 于 2011-5-6 18:27 编辑

7楼第二个代码是根据第一个代码改的,实际可以直接
  1. @echo off&setlocal enableDelayedExpansion&set b=Hanyeguxing
  2. for /f "usebackq delims=" %%a in ("ip列表.txt") do for /f "tokens=11,13 delims=Mm " %%b in ('ping %%a -n 1 -w 80') do  if /i "%%b"=="Average" if %%c lss !b! set a=%%a&set b=%%c
  3. rasdial.exe %a% name pass
复制代码
%%a为ip,%%b为Average,%%c为值
当 ping 不通时,无 Average ,set a=%%a等不执行
当 ping 通且 Average 第一次执行,则数小于字母,所以set a=%%a&set b=%%c,a为ip,b为值
当 ping 通且 Average 不是第一次执行,则新数值与原最小的b比较,小时执行set a=%%a&set b=%%c
作者: missll    时间: 2011-5-6 22:49

谢谢回复  我太笨拙了 看不明白。。。 再研究研究吧。

7楼第二个代码是根据第一个代码改的,实际可以直接@echo off&setlocal enableDelayedExpansion&set b=Hanyeguxing
for /f "usebackq delims=" %%a in ("ip列表.txt") do for /f "tokens=11,13 delims=Mm " %%b in ( ...
hanyeguxing 发表于 2011-5-6 18:14

作者: katolecyan    时间: 2014-6-8 16:18

本帖最后由 katolecyan 于 2014-6-9 21:43 编辑

回复 2# hfg1977


   你好,这个代码在WIN7下运行好像有问题   无法算出最小延时。不知道是什么原因..
作者: katolecyan    时间: 2014-6-9 21:39

本帖最后由 katolecyan 于 2014-6-9 21:40 编辑
  1. setlocal enabledelayedexpansion&cls
  2. echo 正在PING服务器
  3. for /l %%a in (100,1,199) do (
  4. for /f "tokens=4 delims==" %%A in ('ping 192.168.1.%%a^|findstr /i "Average 平均"') do (
  5. set _time=%%~nxA
  6. echo us%%a.yyuu.me %%A
  7. if not defined min (set min=!_time!&set _IP=us%%a.yyuu.me)
  8. if !_time! lss !min! (set min=!_time!&set _IP=us%%a.yyuu.me)
  9. echo min=!min!
  10. echo.
  11. ))
  12. echo min=%min%  IP=%_IP%
  13. pause
复制代码

作者: katolecyan    时间: 2014-6-9 21:43

终于弄好了!谢谢 楼上所有人给的代码!
作者: PowerShell    时间: 2014-6-16 20:28

Name                           Value
----                           -----
a_目标网址:                   www.google.com
b_ping次数:                   4
c_成功次数:                   4
d_超时次数:                   0
e_ping不通?:                 False
f_最小时间:                   267
g_最大时间:                   269
h_平均时间:                   267.75

我也写了解决方案
http://www.bathome.net/thread-30586-1-1.html




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2