| @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 |
| |
| 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% |
| |
| |
| |
| |
| if not "%laststate%"=="%currstate%" set/p= %bel%<nul |
| set/a !stateword:~%currstate%,1!+=1 |
| set/a net_loss=断*1000/(通+断) |
| |
| set net_loss=%net_loss:~0,-1%.%net_loss:~-1%%% |
| title [%host%]:%net_loss% |
| |
| echo %bel%%currstate%0|choice /C 0 /t 5 /d 0 >nul |
| |
| |
| |
| 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 |
| COPY |