Пакетный ответ 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