自己写了个批量ping小工具...

最近有个业务需要对数十个IP进行长时间的ping测试,并观察丢包情况、延迟情况。于是第一时间想到PingInfoView这个小工具。不过使用PingInfoView测出来的丢包率普遍偏高,查看官方README发现以下内容

Known Issues

  • If you ping to a lot of hosts concurrently, PingInfoView may return a failed result to some of the hosts, even if the hosts are ok. In order to solve this issue, go to the ‘Advanced Options’ and decrease the maximum number of concurrent pings.

意思就是如果同时ping大量主机,即使这些主机状态正常,PingInfoView也可能会返回失败结果。要解决此问题,可前往“高级选项”并减少最大并发数。既然这样,那不如自己写一个…以下是详细代码和使用方法,后续若有优化会迭代更新。

详细代码


批量ping测试脚本(batch_ping.bat

1
2
3
4
5
6
7
8
@echo off
setlocal enabledelayedexpansion

for /f "delims= eol=" %%i in (ip.txt) do (
start /B /MIN "" ping -n 3600 -w 1000 "%%i" > "%%i.log"
)

endlocal

结果统计脚本(analyze.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@echo off
setlocal enabledelayedexpansion

:: 检查结果文件是否存在
dir *.log
if %ERRORLEVEL% EQU 0 (
echo 测试结果文件已找到,统计中,请稍等...
) else (
echo 错误:未找到任何测试结果文件
exit /b 1
)

:: 生成报告头
(
echo ^| IP地址 ^| 发送数 ^| 接收数 ^| 丢包数 ^| 最短延迟 ^| 最长延迟 ^| 平均延迟 ^|
echo ================================================================================================================
) > summary.txt

:: 遍历所有结果文件
for %%F in (*.log) do (
set "file=%%F"
set "ip=!file:~0,-4!"

:: 初始化变量
set "sent=0" & set "recv=0" & set "lost=0"
set "min=9999" & set "max=9999" & set "avg=9999"

:: 提取已发送数据
for /f "tokens=4 delims= " %%a in ('findstr "已发送" "!file!"') do (
for /f "tokens=1 delims=, " %%b in ("%%a") do set sent=%%b
)

:: 提取已接收数据
for /f "tokens=6 delims= " %%c in ('findstr "已接收" "!file!"') do (
for /f "tokens=1 delims=, " %%d in ("%%c") do set recv=%%d
)

:: 提取丢失数据
for /f "tokens=8 delims= " %%e in ('findstr "丢失" "!file!"') do set lost=%%e

:: 提取最短延迟数据
for /f "tokens=3 delims= " %%f in ('findstr "最短" "!file!"') do (
for /f "tokens=1 delims=, " %%g in ("%%f") do set min=%%g
)

:: 提取最长延迟数据
for /f "tokens=5 delims= " %%h in ('findstr "最长" "!file!"') do (
for /f "tokens=1 delims=, " %%i in ("%%h") do set max=%%i
)

:: 提取平均延迟数据
for /f "tokens=7 delims= " %%j in ('findstr "平均" "!file!"') do set avg=%%j

:: 数据清洗和格式化
set "min=!min:ms=!" & set "max=!max:ms=!" & set "avg=!avg:ms=!"
if "!min!"=="" set "min=N/A"
if "!max!"=="" set "max=N/A"
if "!avg!"=="" set "avg=N/A"

:: 写入报告
echo ^| !ip! ^| !sent! ^| !recv! ^| !lost! ^| !min!ms ^| !max!ms ^| !avg!ms ^|
) >> summary.txt

:: 显示结果
start "" summary.txt
endlocal

使用方法


适用平台:Windows
工具下载地址:https://pan.baidu.com/s/1P0wfutAeGoK_UaEBpp797A?pwd=cqnh

  1. 将batch_ping.zip拷贝到桌面或者其他路径
  2. 解压batch_ping.zip,进入batch_ping文件夹
  3. 编辑ip.txt,将要测试的IP写进去,一个IP一行
  4. 双击运行batch_ping.bat进行批量ping测试
  5. 测试结束后双击运行analyze.bat对结果进行汇总,会生成一个叫做summary.txt的汇总文件,统计每个IP的发送数、接收数、丢包数、最短延迟、最长延迟和平均延迟

说明

  • batch_ping.bat脚本默认测试1个小时(3600个包)后会自动停止,每个IP的测试结果会保存在x.x.x.x.log文件中(x.x.x.x对应测试的IP),如果需要修改测试时长可以自定义修改代码中的-n 3600参数,也可以直接关闭cmd窗口停止测试,不影响后续的结果统计