下面的checklink.cmd 程序是一个很好的起点。它依赖于您可以进行单次 ping 的事实,如果成功,输出将包含以下行:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
通过提取标记 5 和 7 并检查它们分别是 "Received" 和 "1,",您可以检测到成功。
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%b"=="xunreachable." goto :endloop
if "x%%a"=="xReceived" if "x%%c"=="x1," set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
使用您要测试的名称(或 IP 地址)调用它:
checklink 127.0.0.1
checklink localhost
checklink nosuchaddress
请注意,如果您的语言环境不是英语,则必须将 Received 替换为您语言环境中的相应关键字,例如 recibidos 表示西班牙语。执行测试 ping 以发现您的语言环境中使用的关键字。
要仅在状态更改时通知您,您可以使用:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
但是,正如 Gabe 在评论中指出的那样,您可以只使用 ERRORLEVEL,因此上面第二个脚本的等效项变为:
@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
echo.Link is !state!
set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal