Пакетный ответ с ошибкой ping - PullRequest
10 голосов
/ 17 февраля 2012

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

@echo off
cls
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause

'гонщик' - это имя моего компьютера. У меня сам компьютер пингует, чтобы я мог устранить переменную плохого соединения. Как я уже говорил, партия всегда приводит к провалу Как ни странно, программа работает нормально, если я скопирую код в командную строку. Кто-нибудь знает, почему программа отлично работает в командной строке, но не работает как пакет? Спасибо

Ответы [ 13 ]

22 голосов
/ 16 октября 2015

Более надежный ping метод проверки ошибок:

@echo off
set "host=192.168.1.1"

ping -n 1 "%host%" | findstr /r /c:"[0-9] *ms"

if %errorlevel% == 0 (
    echo Success.
) else (
    echo FAILURE.
)

Это работает, проверяя, напечатана ли строка 69 ms или 314ms ping.

(в переведенных версиях Windows может быть напечатано 42 ms (с пробелом), поэтому мы проверяем это.)

Причина:

Другие предложения, такие как сопоставление time= или TTL, не столь надежны, поскольку при проверке адреса IPv6 не отображается TTL (по крайней мере, на моем компьютере с Windows 7), а переведенные версии Windows могут отображать переведенная версия строки time=. Кроме того, time= может быть не только переведено, но иногда это может быть time<, а не time=, как в случае time<1ms.

4 голосов
/ 26 декабря 2012

Проверка на 0% потерь может дать ложный положительный результат в этом сценарии: допустим, у вас обычно есть сетевой диск на some_IP-адресе, и вы хотите выяснить, включен он или нет.

Если этот диск выключен, и вы пропингуете some_IP-адрес, IP-адрес, с которого вы пропингуете, будет отвечать:
Answer from your_own_IP-address: target host not reachable<br> ... 0% loss

Возможно, вам лучше использовать if exist или if not exist в этом сетевом расположении.

4 голосов
/ 17 февраля 2012

Если бы вы были

echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"

, вы бы увидели, что % лишен.Вы должны экранировать его, поскольку % имеет особое значение в командном файле:

"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss),"

Однако использовать TTL в качестве индикатора успеха проще;

.. | find "TTL"
2 голосов
/ 17 февраля 2012

Я не совсем уверен, каково взаимодействие между FIND и установкой уровня ошибки, но вы можете сделать это довольно легко:

@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%

Это печатает 0, если сбой проверки связи,1, если это удалось.Я заставил его искать только «0% потерь» (а не только 4 пинга), чтобы можно было настроить количество пингов.

Знак процента был удвоен, чтобы его нельзя было принять за переменную, которая должна бытьзамещенный.

Трюк FOR служит просто для установки вывода команды в качестве значения переменной среды.

1 голос
/ 03 марта 2017
ping 198.168.57.98 && echo Success || echo failed
1 голос
/ 24 июня 2015

Да, ping не может вернуть правильный уровень ошибки. Для проверки сетевого подключения и компьютера я использовал «net view computername», затем проверил% errorlevel% - просто и легко

1 голос
/ 07 ноября 2013

Еще один вариант без использования переменной

ping racer -n 1 -w 100>nul || goto :pingerror
...

:pingerror
echo Host down
goto eof

:eof
exit /b
1 голос
/ 11 июля 2013

Самое простое решение, которое я могу придумать:

set error=failure
ping racer -n 1 -w 100>nul 2>&1 && set error=success

Конечно, -w нужно настроить, если на медленном канале (100 мс может быть слишком коротким по сравнению с Dialup; -))

привет

0 голосов
/ 24 апреля 2019

Мне понравилась концепция НАХОДКИ в результатах проверки связи, но почему бы просто не НАЙТИ ответ с проверяемого адреса?

В приведенном ниже примере я ввожу IP-адрес в качестве переменной, PING, что IPзатем найдите эту переменную в строке ответа, используя команду FIND.Если строка ответа содержит что-то кроме правильного IP-адреса, она сообщает об ошибке.

Если вы хотите, вы можете просто прочитать значение ERRORLEVEL из FIND.Это даст вам надежную ценность для работы.

@echo off
Set /P IPAdd=Enter Address:
cls
ping %IPAdd% | find "Reply from %IPAdd%:"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
0 голосов
/ 04 августа 2018

Мне нужно было сбросить соединение Wi-Fi, потому что у него есть проблемы. Это было мое быстрое решение.

@echo off
Rem Microsoft Windows 10 ping test to gateway.
Rem Run batch file from an administrative command prompt.

cls
:starting
Rem Send one ping to the gateway.  Write the results to a file.
ping 192.168.1.1 -n 1 > pingtest.txt

Rem Search for unreachable in the file. 
c:\windows\system32\findstr.exe "unreachable" pingtest.txt

Rem errorlevel 0 reset the adapter if 1 then wait 10 minutes and test again
if %errorlevel%==1 goto waiting

Rem unreachable was found reset the adapter.

Rem write the date and time the reset was done.
echo Reset date: %date% time: %time% >> resettimes.txt

Rem issue netsh interface show interface to find your adapter's name to reset
Rem my adapter is "wi-fi"

netsh interface set interface "wi-fi" disable
timeout /t  5
netsh interface set interface "wi-fi" enable
:waiting
echo "It is online waiting 10 minutes"
timeout /t  600
goto starting
...