#batch-file #ping #errorlevel
#пакетный файл #проверка #уровень ошибки
Вопрос:
Итак, на работе у нас есть несколько компьютеров, на которые мы должны загружать программное обеспечение, и обычно, когда я подключаю свой ноутбук к компьютеру с помощью кабеля Ethernet, я должен установить свой адрес IPv4 на 10.10.1.99
потому что компьютер обычно имеет 10.10.1.101
в качестве IP-адреса, затем я загружаю программное обеспечение на этот компьютер. Теперь иногда на компьютере установлен неправильный IP, например, 10.41.246.70
или 10.42.246.71
.
Поскольку у нас нет простого и быстрого способа проверить, какой IP-адрес есть у компьютера, я написал небольшой скрипт, который изменяет IPv4 моего ноутбука на самый распространенный IP-адрес, который обычно есть у компьютеров, и позволяет ему пинговать эти IP-адреса: Код выглядит следующим образом, и он проходит через около 8 IP-адресов, которые он проверяет:
cls
echo Searching.
netsh interface ip set address "Ethernet" static 10.10.1.99 255.255.255.0 >nul: 2>nul:
ping -w 4 -n 3 10.10.1.101
if !errorlevel!==0 (
set activeip=10.10.1.101
goto :ipfound
)
Обычно этот код работает просто отлично, в 99% случаев это один из 8 известных нам IP-адресов.
Проблема в том, что иногда вместо «Время ожидания запроса истекло» я получаю «Хост назначения недоступен», что по какой-то причине не кажется ошибкой, и когда я получаю хост назначения недоступен, скрипт думает, что нашел правильный IP.
Теперь есть ли способ обойти это, например, добавив какой-либо:
if output == Destination Host Unreachable (goto next IP)
или есть способ сообщить скрипту, что недоступность узла назначения также является ошибкой.
Спасибо всем, кто может каким-либо образом помочь.
Комментарии:
1. Не могли бы вы, пожалуйста, отформатировать свой код как надлежащий блок кода? Это трудно читать таким образом.
2. Вы вообще уверены, что это
ping
следует изменитьerrorlevel
? UNIXping
имеет возвращаемое значение, равное 0 в случае успеха и 1 в случае сбоя. Можете ли вы получить возвращаемое значениеping
вместоerrorlevel
?3.@Dominique да, он установит уровень ошибки, проблема в том, что
destination host unreachable
по-прежнему является ответом и не установлен наerrorlevel
1
Я не могу вспомнить, что он устанавливает, но думаю, что это была цифра минус.. Ping изменяется только0
и1
междуping request could not find host
(1)
,request timed out
(1)
иreply from
(0)
Ответ №1:
Потому что Reply from xx.xx.xx.xx: Destination Host Unreachable
технически это все еще ответ.. :)
Вы можете использовать findstr
для управления вашим errorlevel
ping -w 4 -n 3 10.10.1.101 | findstr /i "TTL"
if "%errorlevel%"=="0" echo Success
if "%errorlevel%"=="0" echo Failed
Имейте в виду, что errorlevel
здесь задается на основе результата findstr
(соответствует ли ваша findstr
строка тому, что вы просили ее найти).
Чтобы продемонстрировать, это вернет errorlevel
of 0
, поскольку строка поиска была удовлетворена:
ping -w 4 -n 3 10.10.1.101 | findstr /i "Destination Host Unreachable"
echo %errorlevel%
Итак, наконец, чтобы изменить ваш скрипт, чтобы он всегда проверял, есть ли фактический reply from
или нет destination host unreachable
, и переходил к следующему IP, пока мы не найдем активный IP, просто выполните:
set "ips=10.10.1.101 10.10.1.102 10.10.1.103 10.10.1.104"
for %%i in (%ips%) do (
ping -w 4 -n 3 %%i | findstr /i "TTL"
if "!errorlevel!"=="0" (
set "activeip=%%i"
goto :ipfound
)
)
Вам нужно просто изменить список IP-адресов, которые вы хотите, там, где я set
мои IP-адреса.
Кроме того, я предполагаю, что вы EnableDelayedExpansion
уже где-то установили, видя, что используете его.
Комментарии:
1. Боже, тысячу раз спасибо! это именно то, что я искал. спасибо за чрезвычайно быстрый и подробный ответ, я попробую это позже, когда у меня будет немного времени, но я уверен, что это будет работать идеально: D
2. @Kyotai Вообще никаких проблем, просто дайте мне знать, если у вас возникнут какие-либо проблемы.