Недоступный узел назначения не приводит к ошибке уровня 1

#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 ? UNIX ping имеет возвращаемое значение, равное 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 Вообще никаких проблем, просто дайте мне знать, если у вас возникнут какие-либо проблемы.