Следующая программа checklink.cmd
- хорошее место для начала. Он основан на том факте, что вы можете выполнить одиночный пинг и что в случае успеха на выходе будет строка:
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
для испанского. Сделайте пробный пинг, чтобы узнать, какое ключевое слово используется в вашем регионе.
Чтобы уведомлять вас только при изменении состояния , вы можете использовать:
@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
Тем не менее, как отметил Гейб в комментарии, вы можете просто использовать 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