Board logo

标题: [网络工具] 批处理主机网络状态监测(ping-t的代替品) [打印本页]

作者: qzwqzw    时间: 5 天前 14:34     标题: 批处理主机网络状态监测(ping-t的代替品)

前两天翻出来很久前写的一个ping扩展脚本
因为许久不用了所以用起来有些生疏
用着用着就觉得各种不爽
尤其不能忍的就是之前XP下听得很舒服的哔哔声
换成了很不习惯的调调
然后就开始分析是什么情况
还专门登录批处理之家去翻找资料+求教高手
(详见如何实现从ping命令结果中查找指定字符串并以响铃提示查找成功
后来得亏是找到其他的替代办法
(分享在批处理一种新的响铃方式

期间就连带发现了程序上其他一些设计上的问题
毕竟最早这段代码就只打算自己偶尔顺手用用
根本没打算发布出去
所以也就很随性没有什么设计
这次再翻出来用竟然忘了当初是怎么考虑的
好多功能界面的细节都比较反直觉
最后一路修改,从小修小补到大刀阔斧
成了如今面目全非的模样
名字也从tping.cmd改成了ping-t.cmd
索性发布出来,免得浪费了两天来耗死的脑细胞
如果有什么问题,可以随便提,有时间我就再改改
没有时间就继续潜水当小透明
  1. @echo off & setlocal enabledelayedexpansion
  2. if not [%1]==[] goto :arg
  3. mode con cols=120
  4. echo.
  5. echo. %~n0 - 主机网络状态监测 (ping -t的替代品)
  6. echo.
  7. echo 用法1:启动命令行,cd到程序目录,输入:%~n0 主机名或IP  间隔秒数(默认6)  ping命令参数(默认-n 1 -w 100)
  8. echo.
  9. echo 用法2:提前将该程序复制到 %windir% 或其它PATH变量指定目录下,在开始-运行对话框中输入用法1中的命令行
  10. echo.
  11. echo 用法3:直接在下方输入要监测的主机名或者IP地址    间隔秒数(默认6)   ping命令参数(默认-n 1 -w 100)
  12. echo.
  13. set /p input=请输入(直接按回车退出):
  14. if "%input%"=="" goto :eof
  15. %0 %input%
  16. :arg
  17. set host=%1
  18. set/a interval=%2-0
  19. set args=-n 1 -w 100
  20. if "%interval%"=="0" (
  21. set interval=6
  22. set args=%args% %2
  23. set cols=120
  24. ) else (
  25.     if !interval! lss 2 (set interval=2) else if !interval! gtr 60 set interval=60
  26. set /a "cols=(60/interval+2)*10"
  27. if !cols! lss 80 (set cols=80) else if !cols! gtr 240 set cols=240
  28. mode con cols=!cols!
  29. )
  30. :argloop - 循环读取命令行后续所有参数,写入环境变量arg
  31. if [%3]==[] goto :init
  32. set args=%args% %3
  33. shift /1
  34. goto :argloop
  35. :init
  36. if not exist %~sdpn0 md %~dpn0
  37. if "%bel%"=="" set bel=
  38. set currstate=-
  39. set stateword=通断
  40. set stateword2=-x
  41. set 通=0
  42. set 断=0
  43. set currtime=%date:~5,5% %time:~0,5%
  44. set tping_log="%~sdpn0\tping.log"
  45. set tping_mon="%~sdpn0\%host%.txt"
  46. set tping_out="%~sdpn0\%host%_%date:~0,4%-%date:~5,2%-%date:~8,2%.log"
  47. echo.%date% %time% : [%host%]网络监测开始,间隔:%interval%秒,参数:%args%>>%tping_log%
  48. if "%cols%"=="120" mode con cols=%cols%
  49. echo.正在对主机[%host%]进行网络状态监测...按Q结束
  50. echo.
  51. echo.命令:ping %args% %host%    间隔:%interval%秒    状态:- 代表通; x 代表断
  52. :mainloop
  53. rem 每个10分钟整点另换一行显示,同时在上一行尾显示丢包率,下一行首显示摘要时间
  54. if "%time:~4,1%"=="0" set currtime=%date:~5,5% %time:~0,5%
  55. if not "%currtime%"=="%lasttime%" (
  56. echo. %net_loss%
  57. echo. %net_loss%>>%tping_mon%
  58. set/p=%currtime% <nul
  59. set/p=%currtime% <nul>>%tping_mon%
  60. )
  61. set/p=%date% %time%:<nul>> %tping_out%
  62. ping %args% %host% | find "TTL=" >> %tping_out% || echo.>> %tping_out%
  63. set currstate=%errorlevel%
  64. rem 经测试,在出现 "TTL 传输中过期"、"目标网络不可达" 等错误时,ping 仍然返回成功
  65. rem 则ping && || 方法只能用作简易的目标可达及请求超时的两种常见情况判断
  66. rem 之前常用find "Reply" / find "TTL" / findstr "(0%%"等方法也对于"TTL 传输中过期"情况存在判断疏漏
  67. rem 目前测试可用的方法是 |find "ms" , 也有使用 find "TTL=",前者会筛出统计数据,后者没有
  68. if not "%laststate%"=="%currstate%" set/p= %bel%<nul
  69. set/a !stateword:~%currstate%,1!+=1
  70. set/a net_loss=断*1000/(通+断)
  71. rem 此处如果net_loss只有一位数,则做小数点左移操作会导致无前缀0,暂时忽略此问题
  72. set net_loss=%net_loss:~0,-1%.%net_loss:~-1%%%
  73. title [%host%]:%net_loss%
  74. rem if "%currstate%"=="1" set/p=%bel%<nul
  75. echo %bel%%currstate%0|choice /C 0 /t 5 /d 0 >nul
  76. rem Ctrl^G ()的响铃字符在Vista以后被转移至系统声音方案中的媒体文件,不再发bee声,且不可连续发声
  77. rem 使用choice方法替代set/p=Ctrl^G响铃字符,可以绕过系统声音方案,发出默认的哔哔声,可连续响铃多次
  78. rem 以上命令实现当网络通(currstate为0)只响一声,网络断(currstate为1)响两声
  79. set/p=!stateword2:~%currstate%,1!<nul
  80. set/p=!stateword2:~%currstate%,1!<nul>>%tping_mon%
  81. set laststate=%currstate%
  82. set lasttime=%currtime%
  83. choice /c yq /t %interval% /d y >nul
  84. if not errorlevel 2 goto :mainloop
  85. echo.&echo.
  86. echo [%host%]网络监测结束,共计ping通%通%次,断%断%次,丢包率:%net_loss%
  87. echo %date% %time% : [%host%]网络监测结束,共计ping通%通%次,断%断%次,丢包率:%net_loss% >>%tping_log%
  88. if "%~f0"=="%~0" pause
  89. rem 如果程序运行命令行为完整命令行,则判断使用独立窗口启动,暂停等待用户确认
复制代码





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