Пинг из windows 7 не получает ответа, но устанавливает errorlevel в 0


10

С компьютера с Windows 7 я проверяю IP-адрес выключенного компьютера.

C:\>ping 192.168.1.222
Pinging 192.168.1.222 with 32 bytes of data:
Reply from 192.168.1.222: Destination host unreachable.
Reply from 192.168.1.222: Destination host unreachable. 
Reply from 192.168.1.222: Destination host unreachable.

Ping statistics for 192.168.1.222:
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss)

Хотя ответа нет, уровень ошибки установлен в 0.

Я пытаюсь выяснить, отвечает ли удаленный компьютер на ping. Один из моих тестов - выключить машину и пинговать ее. По некоторым причинам, ping устанавливает errorlevel в 0.

Ответы:


8

Я также столкнулся с проблемой, и она разрешилась с ключом " -w 2000 ". Ping, дополненный ключом " -w " и числом миллисекунд, возвращает 1, когда хост в локальной подсети недоступен. AFAIK, количество миллисекунд должно быть меньше времени ожидания после того, как сетевая подсистема Windows вернет сообщение «Узел назначения недоступен».

На моем ПК (Windows 7):
C:> ping -w 3000 192.168.10.22

Пинг 192.168.10.22 с 32 байтами данных:
Ответ от 192.168.10.2: узел назначения недоступен.
Ответ от 192.168.10.2: узел назначения недоступен.
Ответ от 192.168.10.2: узел назначения недоступен.
Ответ от 192.168.10.2: узел назначения недоступен.

Статистика пинга для 192.168.10.22:
Пакеты: Отправлено = 4, Получено = 4, Потерянно = 0 ( потеря 0% ),

C:> echo% errorlevel%
0

но

C:> ping -w 2999 192.168.10.22

Пинг 192.168.10.22 с 32 байтами данных:
истекло время ожидания запроса.
Истекло время запроса.
Истекло время запроса.
Истекло время запроса.

Статистика пинга для 192.168.10.22:
Пакеты: отправлено = 4, получено = 0, потеряно = 4 ( потеря 100% ),

C:> echo% errorlevel%
1


Кто-нибудь может подтвердить, что это действительно для всех случаев использования?
user1853181

2
Я протестировал установку -wпереключателя на 2999 с действительным и недействительным IP-адресом, -n 1а также добавил переключатель. Вроде работает.
фырье

да ... это устанавливает уровень ошибки, если нет хоста по указанному адресу ... спасибо
ZEE

7

Это потому, что пункт назначения находится в вашей локальной подсети. Если пункт назначения находится за пределами вашей локальной подсети, ожидаемый Request timed out.виден. Тем не менее, даже несуществующие пункты назначения в вашей локальной подсети будут сообщать Reply from x.x.x.x: Destination host unreachable.. Как это вихревая пост объясняет, все это зависит от того, является ли его первым хмель , что тайм - аут - и пинг вашей локальной подсети только один хмель. Видимо, именно по умолчанию уровень ошибки устанавливается 0при получении любого ответа, и host unreachableсчитается ответом.


обходные

Разбор pingвывода сfindstr

Источник: http://forums.techguy.org/7318331-post3.html

Следующий будет пинговать его один раз ( ping -n 1). Это %1первый параметр, переданный в командный файл. Переменная attribустанавливается в зависимости от того, отвечает адресат или нет.

echo Scanning %1
set attrib=responding
ping -n 1 %1|Findstr /I /C:"timed out" /C:"host unreachable" /C:"could not find host"
if %errorlevel%==0 set attrib=nonresponsive

Отдельная утилита

Есть интересная утилита, которая называется живой . Я не пробовал, и он был выпущен в 2002 году, поэтому он может даже не работать в Windows 7. Однако, если он работает, он установит уровень ошибки в 2, когда хост назначения недоступен. Я бы не стал этого рекомендовать.


+1 за alive, использовал это много лет назад тоже, по этой самой причине.
Брайан

Если ответ «Запрос Ping не может найти хост madeup04. Пожалуйста, проверьте имя и попробуйте снова», это не работает, потому что он ищет «хост недоступен», поэтому ваш результат «madeup04 отвечает», что неверно.
Джеймс Дженкинс

1
@JamesJenkins Я сделал предположение, что, как и в этом вопросе, попытка пинга направлена ​​против IP-адреса. Даже тогда, это тривиальное изменение (добавить еще одну /Cстроку поиска). Вряд ли стоит понизить голос. На самом деле, я изменил ответ, так что спасибо за указание на это.
Боб

Тьфу ... ну, это глупо ... Потратил половину моего дня, пытаясь выяснить, почему моя система сообщала о подсистеме как о подключенной к сети - хотя она явно не была ...
Мэтт Кларк,

2

Это работает для меня в Windows 7:

@echo off
setlocal enableextensions enabledelayedexpansion

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

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.