Подтвердить что ты не робот

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

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

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

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

ping <servername> -t

Но как я могу проверить, ответил ли он или нет?

4b9b3361

Ответ 1

Следующая программа 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, чтобы эквивалент второй script выше:

@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

Ответ 2

Вопрос состоял в том, чтобы увидеть, ответил ли ping, что это делает script.

Однако это не сработает, если вы получите сообщение Host Unreachable, так как оно возвращает ERRORLEVEL 0 и передает проверку на Received = 1, используемую в этом script, возвращая ссылку UP из script. Host Unreachable возникает, когда ping был доставлен в целевую notwork, но удаленный хост не найден.

Если я вспомню правильный способ проверить успешность пинга, это искать строку "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.

Ответ 3

Я знаю, что это старый поток, но я хотел проверить, была ли машина в моей системе, и если я не понял, ни одно из вышеизложенных действий не работает, если мой маршрутизатор сообщает, что адрес недоступен. Я использую пакетный файл, а не script, потому что я хотел "KISS" на почти любой машине WIN. Таким образом, подход, который я использовал, состоял в том, чтобы выполнить более одного пинга и проверить "Lost = 0" следующим образом

ping -n 2 %pingAddr% | find /I "Lost = 0"  
if %errorlevel% == 0 goto OK

Я не тестировал это строго, но пока это делает для меня работу

Ответ 4

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

Ответ 5

Простая версия:

for /F "delims==, tokens=4" %a IN ('ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
echo FAIL
)

)

Но иногда первый пинг просто терпит неудачу, а второй работает (или наоборот)? Поэтому мы хотим добиться успеха, если хотя бы один ответ ICMP был успешно возвращен:

for /F "delims==, tokens=4" %a IN ('ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
if %a EQU 1 (
echo Success
) ELSE (
echo FAIL
)
)

)

Ответ 6

Я сделал вариант решения на основе paxdiablo post

Поместите следующий код в Waitlink.cmd

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
echo.Link is !state!
if "!state!"=="up" (
  goto :endloop
)
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
:endloop
endlocal

Например, используйте его из другого пакетного файла, такого как

call Waitlink someurl.com
net use o: \\someurl.com\myshare

Вызов waitlink будет возвращаться только тогда, когда пинг будет успешным. Благодаря paxdiablo и Gabe. Надеюсь, это поможет кому-то еще.

Ответ 7

Вот что я нашел:

:pingtheserver
ping %input% | find "Reply" > nul
if not errorlevel 1 (
    echo server is online, up and running.
) else (
    echo host has been taken down wait 3 seconds to refresh
    ping 1.1.1.1 -n 1 -w 3000 >NUL
    goto :pingtheserver
) 

Обратите внимание, что ping 1.1.1.1 -n -w 1000 >NUL будет ждать 1 секунду, но работает только при подключении к сети

Ответ 8

Надеюсь, это поможет кому-то. Я использую этот бит логики, чтобы проверить, реагируют ли сетевые ресурсы перед проверкой отдельных путей. Он должен обрабатывать DNS-имена и IP-адреса.

Допустимый путь в текстовом файле \ 192.168.1.2\'папка' или\NAS\'папка'

@echo off
title Network Folder Check

pushd "%~dp0"
:00
cls

for /f "delims=\\" %%A in (Files-to-Check.txt) do set Server=%%A
    setlocal EnableDelayedExpansion
        ping -n 1 %Server% | findstr TTL= >nul 
            if %errorlevel%==1 ( 
                ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul
                    if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF)
            )
:EOF

Ответ 9

Я видел три результата для ping - тот, который мы "хотим", где отвечает IP, "Host Unreachable" и "timed out" (не уверен в точном выражении).

Первые два возвращают ERRORLEVEL 0.

Время ожидания возвращает ERRORLEVEL 1.

Можно ли вернуть другие результаты и уровни ошибок? (Помимо использования недопустимого переключателя, который возвращает допустимые переключатели и уровень ошибок 1.)

Очевидно, что Host Unreachable может использовать один из ранее опубликованных методов (хотя трудно понять, когда кто-то отвечает, в каком случае они пишут код), но возвращает ли таймаут аналогично тому, как его можно разобрать?

В общем, как узнать, какая часть результатов ping может быть проанализирована? (То есть, почему Sent и/или Received и/или TTL могут обрабатываться, но не могут быть недоступны?

О, и iSid, может быть, не так много оборотов, потому что люди, которые читают это, не имеют достаточного количества очков. Поэтому они получают ответ на свой вопрос (или нет) и уходят.

Я не публиковал это как ответ. Это должен был быть комментарий, но я не видел этого выбора.