Пакетный ответ ERRORLEVEL ping

Я пытаюсь использовать пакетный файл для подтверждения сетевого подключения с помощью ping. Я хочу выполнить пакетный запуск, а затем распечатать, если 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

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

Ответ 1

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

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

Отправляется 0, если ping не удалось, 1, если это удалось. Я заставил его искать только "0% -ную потерю" (не только 4 пинга), чтобы можно было настроить количество пингов.

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

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

Ответ 2

Более надежный метод проверки ошибок 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.

Ответ 3

Если вы были

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

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

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

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

.. | find "TTL"

Ответ 4

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

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

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

Ответ 5

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

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

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

рассматривает

Ответ 6

Другое изменение без использования какой-либо переменной

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

:pingerror
echo Host down
goto eof

:eof
exit /b

Ответ 7

ping 198.168.57.98 && echo Success || echo failed

Ответ 8

Основываясь на замечании Алекса К., это работает для меня в Windows 7:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f %%i in (PCS.TXT) do (
   SET bHOSTUP=0
   ping -n 2 %%i |find "TTL=" > NUL && SET bHOSTUP=1
   IF !bHOSTUP! equ 1 (
      CALL :HOSTUP %%i
   ) else (
      CALL :HOSTDOWN %%i 
   )
)
GOTO EOF

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B

Ответ 9

Прежде всего

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

Не работает. Если он не подведет, он обнаружит 0%, потому что он имеет 0%. Если он терпит неудачу, он не работает, потому что он будет иметь 100% -ную потерю, а значит, он нашел 0% -ную потерю за 10 10 (потеря 0%)

Определилось ли это на 100% -ную потерю:

>for /f %%i in ('ping  -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i

Уровень ошибок может быть немного испорчен, но он работает как шарм:

>if '%check%'=='1' goto fail
>if '%check%'=='0' echo %pc% is online.&goto starting

1 означает, что он не прошел 0 означает, что он преуспел

В моих script используются ссылки. Перейти к сбою будет: сбой в моем script, который сообщит мне, что% pc% (который я буду вводить пользователю в начале) находится в автономном режиме и отправится на другой запуск.

>:fail
>color 0c
>title %pc% is offline
>echo %pc% is offline
>PING -n 6 127.0.0.1>nul
>goto choice

Надеюсь, это поможет.

Ответ 10

ping имеет выходное значение ошибки. Успех равен 0, сбой - 1. Просто сделайте следующее:

C:\>ping 4.2.2.2

Pinging 4.2.2.2 with 32 bytes of data:

Reply from 4.2.2.2: bytes=32 time=28ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57
Reply from 4.2.2.2: bytes=32 time=30ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57

Ping statistics for 4.2.2.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 28ms, Maximum = 30ms, Average = 29ms

C:\>echo %errorlevel%
0

C:\>ping foo.bar
Ping request could not find host foo.bar. Please check the name and try again.

C:\>echo %errorlevel%
1

Как вы можете видеть, нет необходимости в этом переполнении скриптов.

Ответ 11

set ErrorLevel=1
(ping example.com -n 1 && set ErrorLevel=0)>nul

ErrorLevel 0, если example.com находится в сети, 1 в противном случае.

ПРИМЕЧАНИЕ. Протестировано только на Win8!

Ответ 12

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

Ответ 13

Мне нужно было сбросить соединение 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 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

Ответ 14

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

В приведенном ниже примере я ввожу IP-адрес в качестве переменной, проверяю этот 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