标题: [网络连接] [已处理]批处理如何检测N个IP的最少PING值后计算出最小值? [打印本页]
作者: missll 时间: 2011-5-4 23:56 标题: [已处理]批处理如何检测N个IP的最少PING值后计算出最小值?
本帖最后由 missll 于 2011-5-6 12:54 编辑
之前发过一个帖子询问 当时是直接检测PING值 有些不准确 所以另开帖提问,
目的: PING N个IP输出到文本,检测平均times值最少的 然后执行拨号动作, 例如:- Pinging 1.224.163.46 with 32 bytes of data:
-
- Reply from 1.224.163.46: bytes=32 time=406ms TTL=116
- Reply from 1.224.163.46: bytes=32 time=421ms TTL=116
- Reply from 1.224.163.46: bytes=32 time=405ms TTL=116
- Reply from 1.224.163.46: bytes=32 time=421ms TTL=116
- Ping statistics for 1.224.163.46:
- Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
- Approximate round trip times in milli-seconds:
- Minimum = 405ms, Maximum = 421ms, Average = 413ms
-
- Pinging 121.78.237.45 with 32 bytes of data:
-
- Reply from 121.78.237.45: bytes=32 time=326ms TTL=114
- Reply from 121.78.237.45: bytes=32 time=297ms TTL=114
- Reply from 121.78.237.45: bytes=32 time=296ms TTL=114
- Reply from 121.78.237.45: bytes=32 time=327ms TTL=114
-
- Ping statistics for 121.78.237.45:
- Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
- Approximate round trip times in milli-seconds:
- Minimum = 296ms, Maximum = 327ms, Average = 311ms
-
- Pinging 222.236.47.239 with 32 bytes of data:
-
- Reply from 222.236.47.239: bytes=32 time=383ms TTL=118
- Reply from 222.236.47.239: bytes=32 time=406ms TTL=118
- Reply from 222.236.47.239: bytes=32 time=390ms TTL=118
- Reply from 222.236.47.239: bytes=32 time=374ms TTL=118
-
- Ping statistics for 222.236.47.239:
- Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
- Approximate round trip times in milli-seconds:
- Minimum = 374ms, Maximum = 406ms, Average = 388ms
复制代码
以上三个IP中 time最少的平均值是121.78.237.45,然后执行 rasdial.exe 121.78.237.45 name pass 来拨号连接。
之间的批处理是这样写的:- @echo off
- ::--------------------------------
- ping 1.224.163.46 -n 1 >>%TEMP%\ip.txt
- ping 121.78.237.45 -n 1 >>%TEMP%\ip.txt
- ping 222.236.47.239 -n 1 >>%TEMP%\ip.txt
- ::--------------------------------
- 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
- ) else (echo not found %TEMP%\ip.txt)
- del /q %TEMP%\ip.txt
- pause
复制代码
它的缺点是 只PING了一个 不能更准确的显示平均时间, 因为只在含有“Reply”中寻找 用for /f 取出IP地址来
但是如果检测平均值 含有Average 字样的行没有IP 所以我不知道怎么显示了. 并且只是显示所有的PING值 我自己看哪个最少来手动拨号的.
如何取出这些平均值后如何逐步计算 一直到找出最小的呢? 以上是PING了3个,如果更多的时候怎么写. 请指点...
作者: hfg1977 时间: 2011-5-5 02:19
- @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 /i "Average"') do (
- set _time=%%~nxA
- set _time=!_time:ms=!
- set _time=!_time:~,-1!
-
- if not defined min (set min=!_time!&set _IP=%%a)
- if !_time! lss !min! (set min=!_time!&set _IP=%%a)
- echo min=!min!
- echo.
- ))
-
- 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 编辑
- @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 %%d lss !a:*:^=! set a=!b!:%%d
- )
- for /f "delims=:" %%a in ("%a%") do rasdial.exe %%a name pass
复制代码
或:- @echo off&setlocal enableDelayedExpansion&set a=:Hanyeguxing
- 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 (
- if /i "%%X"=="Pinging" set b=%%Y
- if /i "%%b"=="Average" if %%d lss !a:*:^=! set a=!b!:%%d
- )
- 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
感谢管理员 这篇文章我已看过 学习。
作者: 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? 看后边的代码没有理解.- 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个节点.- E:\>ping 1.224.163.46 -w 80
- Pinging 1.224.163.46 with 32 bytes of data:
- Request timed out.
- Reply from 1.224.163.46: bytes=32 time=296ms TTL=116
- Reply from 1.224.163.46: bytes=32 time=280ms TTL=116
- Reply from 1.224.163.46: bytes=32 time=296ms TTL=116
- Ping statistics for 1.224.163.46:
- Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
- Approximate round trip times in milli-seconds:
- Minimum = 280ms, Maximum = 296ms, Average = 290ms
复制代码
- 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楼第二个代码是根据第一个代码改的,实际可以直接- @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 ('ping %%a -n 1 -w 80') do if /i "%%b"=="Average" if %%c lss !b! set a=%%a&set b=%%c
- 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 编辑
- setlocal enabledelayedexpansion&cls
- echo 正在PING服务器
- for /l %%a in (100,1,199) do (
- for /f "tokens=4 delims==" %%A in ('ping 192.168.1.%%a^|findstr /i "Average 平均"') do (
- set _time=%%~nxA
- echo us%%a.yyuu.me %%A
-
- if not defined min (set min=!_time!&set _IP=us%%a.yyuu.me)
- if !_time! lss !min! (set min=!_time!&set _IP=us%%a.yyuu.me)
- echo min=!min!
- echo.
- ))
-
- echo min=%min% IP=%_IP%
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |