Я хочу непрерывно проверить с помощью ping-запросов сервер и видеть окно сообщения, когда когда-либо это отвечает, т.е. сервер в настоящее время снижается. Я хочу сделать это через пакетный файл.
Я могу показать окно сообщения, как сказано здесь Шоу всплывающее окно/окно сообщения от пакетного файла Windows
и может проверять с помощью ping-запросов непрерывно
ping -t
Но как я проверяю, ответило ли это или нет?
Следующая программа checklink.cmd
- хорошее место для начала. Он основан на том факте, что вы можете выполнить одноразовый эхо-запрос и что в случае успеха вывод будет содержать строку:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Путем извлечения токенов 5 и 7 и проверки их соответственно «Получено»
и «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
Вы можете пинговать без «-t» и проверять код выхода пинга. Он сообщает об ошибке, когда нет ответа.
Вопрос состоял в том, чтобы увидеть, ответил ли ping, что делает этот скрипт.
Однако это не сработает, если вы получите сообщение Host Unreachable, поскольку оно возвращает ERRORLEVEL 0 и проходит проверку Received = 1, используемую в этом скрипте, возвращая Link is UP из скрипта. Host Unreachable возникает, когда эхо-запрос был доставлен на целевую неработающую, но удаленный хост не может быть найден.
Насколько я помню, правильный способ проверить успешность эхо-запроса - это поиск строки «TTL» с помощью функции «Найти».
@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%
Это не будет работать с сетями IPv6, потому что ping не будет отображать TTL при получении ответа с IPv6-адреса.