Как проверить, ответил ли ping или не в пакетном файле

Я хочу непрерывно проверить с помощью ping-запросов сервер и видеть окно сообщения, когда когда-либо это отвечает, т.е. сервер в настоящее время снижается. Я хочу сделать это через пакетный файл.

Я могу показать окно сообщения, как сказано здесь Шоу всплывающее окно/окно сообщения от пакетного файла Windows

и может проверять с помощью ping-запросов непрерывно

ping  -t

Но как я проверяю, ответило ли это или нет?

40
задан Community 23 May 2017 в 11:55
поделиться

3 ответа

Следующая программа 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
19
ответ дан 27 November 2019 в 01:49
поделиться

Вы можете пинговать без «-t» и проверять код выхода пинга. Он сообщает об ошибке, когда нет ответа.

0
ответ дан 27 November 2019 в 01:49
поделиться

Вопрос состоял в том, чтобы увидеть, ответил ли 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-адреса.

28
ответ дан 27 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: