Для простой проверки, такой как ваша, следующее Find
удовлетворит вашу потребность.
( ( PING 8.8.8.8 | FIND /I "Reply From 8.8.8.8" >Nul ) && ECHO(Success! ) || ECHO(Failure!
Вот ваш оригинальный код с использованием этого метода:
:login3
cls
echo.
echo Login information cleared!
echo Press any key to confirm internet connection.
pause > nul
(
PING 8.8.8.8 | FIND /I "Reply From 8.8.8.8" >Nul && (
start "" https://stackoverflow.com
cls
echo.
echo test
echo if you got connected to the website, then you should end up here.
pause
)
) || (
cls
color 0c
echo.
echo Login failed. Try again later.
pause > nul
)
Exit /b
&& позволяет проверить успешность, а || тесты не пройдены, и поскольку Find просто сообщит об успехе или один раз провалится, нам не нужно беспокоиться о том, сколько раз мы тестируем (хотя у вас может быть причина протестировать более 4 или менее 4 пингов, мы просто поработаем с этим на данный момент)
Это означает, что если мы сопоставим ответ и у него будет исходный IP-адрес, который мы искали, то мы знаем, что это должен быть ответ от хоста, на который мы отправляем эхо-запрос, и мы получим успех и выполним все в && блок.
Однако, если мы НИКОГДА не совпадем с ожидаемым результатом, то Find вернет ошибку, и мы пропустим блок && и выполним все в || блок.
Теперь, чтобы понять суть вещей, почему мы не просто используем% Loss или уровень ошибок:
Ааа, это то, что все время возникает, когда нужно это сделать, и с вами очень легко справиться, вы знаете предостережения.
Вначале вы бы подумали, что соответствует% Loss One и все правильно?
Например:
REM For /F Example
FOR /F "Tokens=2 Delims=(%%" %A in ('ping 8.8.8.8') DO @( IF /I %%~A GTR 0 ( ECHO. OKAY! ) ELSE ( ECHO.Failed! ) )
REM Find Example
( ( ping 8.8.8.8 | FIND /I "(100%" >nul ) && Echo.Failed! ) || Echo.Success!
Хорошо, когда у вас есть пункт назначения, который не может быть достигнут маршрутизатором между вами и IP, маршрутизатор иногда отвечает «Destination Host Unreachable
» ( Это может происходить каждый пинг, один в каждый X пинг или никогда, это зависит от того, как настроен маршрутизатор .)
Это фактический ответ ICMP, и поэтому Ping внутренне просто отслеживает фактические ответы и отображает их результаты, поэтому% потерь не будет равен 100%.
Получатель недоступен будет считаться ответом, поскольку маршрутизатор отвечает вам.
Reply from 10.41.3.232: Destination net unreachable.
Это означает, что вы также не можете просто посчитать совпадение «Ответить» через For /F
Loop или Find
/ FindStr
.
Однако, как вы могли заметить из приведенного выше примера, в этих случаях возвращается IP-адрес маршрутизатора, поэтому уникальный ответ от вас, который вы хотите посчитать, всегда будет содержать IP-адрес источника.
Так что для простой проверки, такой как ваша, следующее Find
удовлетворит вашу потребность.
( ( PING 8.8.8.8 | FIND /I "Reply From 8.8.8.8" >Nul ) && ECHO(Success! ) || ECHO(Failure!
Если вы предпочитаете, вы можете вызывать функции или указывать код внутри && и || Разделы
Кроме того, как вы справляетесь со случаем использования имени хоста / FQDN для проверки связи вместо IP?
Здесь вы можете использовать цикл For Loop для получения IP-ответа от команды Ping, а затем использовать его для дальнейшего тестирования.
Это может быть сделано в потоке, если включено отложенное расширение, или, если нет, потребует некоторого анализа в функции. Но это также приводит к тому, что делать, если вы хотите получить более одного ответа в зависимости от того, сколько ответов вы получили.
Как только вы перебираете результаты, вы не захотите иметь более одного срабатывания, поэтому проще всего просто посчитать количество совпадений, которые в любом случае совпадают, и затем проверить, больше ли 0, так как это тривиальная разница .
Проверка, когда проверяемый адрес является именем, а не IP
@(
SetLocal EnableDelayedExpansion
ECHO OFF
SET "_Count=0"
)
FOR /F "Tokens=1-2 Delims=[]" %%A IN ('Ping www.aol.com') DO (
IF /I "%%B" NEQ "" (
SET "_IP=%%B"
) ELSE (
ECHO.%%A | FIND /I "Reply From !_IP!" >nul && SET /A "_Count+=1"
)
)
IF /I %_Count% GTR 0 (
Echo.Success!
) ELSE (
Echo.Failure!
)
Это позволяет вам иметь больше, чем просто состояние успеха / неудачи, если вы хотите сделать что-то другое в зависимости от количества возвращенных ответов. Как отмечалось выше, не вести счет и иметь только успех или неудачу будет почти идентично.
Тем не менее, он работает только так, как указано выше, когда исходный элемент НЕ был IP.
Выполнение вышеперечисленного для IP, по сути, такое же, как и в оригинальном случае, но для большей ясности вот что:
Проверьте, когда указан IP, и сохраните счет
@(
SetLocal EnableDelayedExpansion
ECHO OFF
SET "_Count=0"
)
FOR /F "Tokens=*" %A IN ('PING 8.8.8.8 ^| FIND /I "Reply From 8.8.8.8"') DO (
SET /A "_Count+=1"
)
IF /I %_Count% GTR 0 (
Echo.Success!
) ELSE (
Echo.Failure!
)
Но это работает ТОЛЬКО когда это IP.
Но, ладно, теперь вы, вероятно, задаетесь вопросом, как справиться с обоими, и я чувствую, что действительно должен решить эту проблему на каком-то уровне.
Итак, если вы выполните два пинга, вы можете проверить, разрешил ли Ping имя через DNS, однако в любом DNS-запросе возможно, что вы могли бы получить другой IP-адрес.
Ну, это возможночтобы заставить любой IP с разрешением показывать скобки с помощью Ping -a
в своем тесте, тогда вы можете использовать команду более объемного.
C:\Admin>ping -a 8.8.8.8
Pinging dns.google [8.8.8.8] with 32 bytes of data:
Однако это не учитывает IP-адресакоторые не имеют обратного указателя, но все еще могут быть проверяемыми.
C:\Admin>ping -a 10.10.172.1
Pinging 10.10.172.1 with 32 bytes of data:
Поэтому, если вы выполните два пинга, вы можете проверить, разрешил ли Ping имя через DNS, однако, в любом данном DNS-запросе это возможновы могли бы получить другой IP-адрес, поэтому, хотя у нас может быть два цикла и один из них установлен на 1 пинг только для того, чтобы посмотреть, разрешится ли он, мы не можем использовать результат и отказаться от второго цикла, и даже если мы установимping to 1 response - мы удлиняем процесс.
Так что было бы лучше не делать ненужный вызов команды ping, тем более что некоторые сценарии занимают много времениответить.
И чтобы сделать это, мы должны немного изменить подход к установке переменной _IP
, чтобы выполнить обе наши задачи с помощью только одного цикла и одной команды ping.
Чтобы сделатьэто мы меняем нашу логику, чтобы увидеть, определена ли переменная _IP
, если мы не проверяем, нашел ли второй член что-то ( IE, что были обнаружены скобки с IP в них) в этом случае мы можем использовать этот IP, и если этот термин будет пустым, мы будем предполагать, что первоначально данный адрес был IP, а не именем.
Примечание. В случае, если он былимя, но DNS не разрешил его, мы все равно не можем пропинговать его, и Ping выдаст только одно сообщение об ошибке, а затем завершится, поэтому нам не нужно беспокоиться о том, что это значение - имя, а не IP.
В этом сценарии мы проверим, была ли еще определена наша переменная _IP
.
@(
SetLocal EnableDelayedExpansion
ECHO OFF
SET "_PingAddress=www.aol.com"
SET "_Count=0"
)
FOR /F "Tokens=1-2 Delims=[]" %%A IN ('Ping %_PingAddress%') DO (
IF NOT DEFINED _IP (
IF /I "%%B" NEQ "" (
SET "_IP=%%B"
) ELSE (
SET "_IP=%_PingAddress%"
)
) ELSE (
ECHO.%%A | FIND /I "Reply From !_IP!" >nul && SET /A "_Count+=1"
)
)
IF /I %_Count% GTR 0 (
Echo.Success!
) ELSE (
Echo.Failure!
)
Это также немного чище, чем оригиналтест на адрес ИМО и ручкамиэто сценарий IP-адресов.