
标题: [网络工具] 批处理主机网络状态监测(ping-t的代替品) [打印本页]
作者: qzwqzw 时间: 5 天前 14:34 标题: 批处理主机网络状态监测(ping-t的代替品)
前两天翻出来很久前写的一个ping扩展脚本
因为许久不用了所以用起来有些生疏
用着用着就觉得各种不爽
尤其不能忍的就是之前XP下听得很舒服的哔哔声
换成了很不习惯的调调
然后就开始分析是什么情况
还专门登录批处理之家去翻找资料+求教高手
(详见如何实现从ping命令结果中查找指定字符串并以响铃提示查找成功)
后来得亏是找到其他的替代办法
(分享在批处理一种新的响铃方式)
期间就连带发现了程序上其他一些设计上的问题
毕竟最早这段代码就只打算自己偶尔顺手用用
根本没打算发布出去
所以也就很随性没有什么设计
这次再翻出来用竟然忘了当初是怎么考虑的
好多功能界面的细节都比较反直觉
最后一路修改,从小修小补到大刀阔斧
成了如今面目全非的模样
名字也从tping.cmd改成了ping-t.cmd
索性发布出来,免得浪费了两天来耗死的脑细胞
如果有什么问题,可以随便提,有时间我就再改改
没有时间就继续潜水当小透明
- @echo off & setlocal enabledelayedexpansion
- if not [%1]==[] goto :arg
- mode con cols=120
- echo.
- echo. %~n0 - 主机网络状态监测 (ping -t的替代品)
- echo.
- echo 用法1:启动命令行,cd到程序目录,输入:%~n0 主机名或IP 间隔秒数(默认6) ping命令参数(默认-n 1 -w 100)
- echo.
- echo 用法2:提前将该程序复制到 %windir% 或其它PATH变量指定目录下,在开始-运行对话框中输入用法1中的命令行
- echo.
- echo 用法3:直接在下方输入要监测的主机名或者IP地址 间隔秒数(默认6) ping命令参数(默认-n 1 -w 100)
- echo.
- set /p input=请输入(直接按回车退出):
- if "%input%"=="" goto :eof
- %0 %input%
-
- :arg
- set host=%1
- set/a interval=%2-0
- set args=-n 1 -w 100
- if "%interval%"=="0" (
- set interval=6
- set args=%args% %2
- set cols=120
- ) else (
- if !interval! lss 2 (set interval=2) else if !interval! gtr 60 set interval=60
- set /a "cols=(60/interval+2)*10"
- if !cols! lss 80 (set cols=80) else if !cols! gtr 240 set cols=240
- mode con cols=!cols!
- )
- :argloop - 循环读取命令行后续所有参数,写入环境变量arg
- if [%3]==[] goto :init
- set args=%args% %3
- shift /1
- goto :argloop
-
- :init
- if not exist %~sdpn0 md %~dpn0
- if "%bel%"=="" set bel=
- set currstate=-
- set stateword=通断
- set stateword2=-x
- set 通=0
- set 断=0
- set currtime=%date:~5,5% %time:~0,5%
- set tping_log="%~sdpn0\tping.log"
- set tping_mon="%~sdpn0\%host%.txt"
- set tping_out="%~sdpn0\%host%_%date:~0,4%-%date:~5,2%-%date:~8,2%.log"
- echo.%date% %time% : [%host%]网络监测开始,间隔:%interval%秒,参数:%args%>>%tping_log%
- if "%cols%"=="120" mode con cols=%cols%
- echo.正在对主机[%host%]进行网络状态监测...按Q结束
- echo.
- echo.命令:ping %args% %host% 间隔:%interval%秒 状态:- 代表通; x 代表断
-
- :mainloop
- rem 每个10分钟整点另换一行显示,同时在上一行尾显示丢包率,下一行首显示摘要时间
- if "%time:~4,1%"=="0" set currtime=%date:~5,5% %time:~0,5%
- if not "%currtime%"=="%lasttime%" (
- echo. %net_loss%
- echo. %net_loss%>>%tping_mon%
- set/p=%currtime% <nul
- set/p=%currtime% <nul>>%tping_mon%
- )
- set/p=%date% %time%:<nul>> %tping_out%
- ping %args% %host% | find "TTL=" >> %tping_out% || echo.>> %tping_out%
- set currstate=%errorlevel%
- rem 经测试,在出现 "TTL 传输中过期"、"目标网络不可达" 等错误时,ping 仍然返回成功
- rem 则ping && || 方法只能用作简易的目标可达及请求超时的两种常见情况判断
- rem 之前常用find "Reply" / find "TTL" / findstr "(0%%"等方法也对于"TTL 传输中过期"情况存在判断疏漏
- rem 目前测试可用的方法是 |find "ms" , 也有使用 find "TTL=",前者会筛出统计数据,后者没有
- if not "%laststate%"=="%currstate%" set/p= %bel%<nul
- set/a !stateword:~%currstate%,1!+=1
- set/a net_loss=断*1000/(通+断)
- rem 此处如果net_loss只有一位数,则做小数点左移操作会导致无前缀0,暂时忽略此问题
- set net_loss=%net_loss:~0,-1%.%net_loss:~-1%%%
- title [%host%]:%net_loss%
- rem if "%currstate%"=="1" set/p=%bel%<nul
- echo %bel%%currstate%0|choice /C 0 /t 5 /d 0 >nul
- rem Ctrl^G ()的响铃字符在Vista以后被转移至系统声音方案中的媒体文件,不再发bee声,且不可连续发声
- rem 使用choice方法替代set/p=Ctrl^G响铃字符,可以绕过系统声音方案,发出默认的哔哔声,可连续响铃多次
- rem 以上命令实现当网络通(currstate为0)只响一声,网络断(currstate为1)响两声
- set/p=!stateword2:~%currstate%,1!<nul
- set/p=!stateword2:~%currstate%,1!<nul>>%tping_mon%
- set laststate=%currstate%
- set lasttime=%currtime%
- choice /c yq /t %interval% /d y >nul
- if not errorlevel 2 goto :mainloop
-
- echo.&echo.
- echo [%host%]网络监测结束,共计ping通%通%次,断%断%次,丢包率:%net_loss%
- echo %date% %time% : [%host%]网络监测结束,共计ping通%通%次,断%断%次,丢包率:%net_loss% >>%tping_log%
- if "%~f0"=="%~0" pause
- rem 如果程序运行命令行为完整命令行,则判断使用独立窗口启动,暂停等待用户确认
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |