O ping do windows 7 não obtém resposta, mas define o nível de erro como 0

10

Em uma máquina com Windows 7, sigo um endereço IP de uma máquina desligada.

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)

Mesmo que não haja nenhuma resposta, o errorlevel está definido para 0.

O que estou tentando fazer é descobrir se uma máquina remota está respondendo ao ping. Um dos meus testes é desligar a máquina e executar ping. Por alguma razão, o ping define o nível de erro como 0.

Doron
fonte

Respostas:

8

Eu também enfrentei o problema e ele resolveu com a chave " -w 2000 ". O ping suplementado com a chave " -w " e o número de milissegundos retorna 1 quando o host na sub-rede local está inacessível. AFAIK, o número de milissegundos deve ser menor que o tempo limite após o subsistema de rede do Windows retornar "Host de destino inacessível".

No meu PC (Windows 7):
C:> ping -w 3000 192.168.10.22

Pingando 192.168.10.22 com 32 bytes de dados:
Resposta de 192.168.10.2: Host de destino inacessível.
Resposta de 192.168.10.2: Host de destino inacessível.
Resposta de 192.168.10.2: Host de destino inacessível.
Resposta de 192.168.10.2: Host de destino inacessível.

Estatísticas de ping para 192.168.10.22:
Pacotes: enviados = 4, recebidos = 4, perdidos = 0 ( perda de 0% ),

C:> eco% errorlevel%
0

mas

C:> ping -w 2999 192.168.10.22

Pingando 192.168.10.22 com 32 bytes de dados: A
solicitação expirou.
O pedido expirou.
O pedido expirou.
O pedido expirou.

Estatísticas de ping para 192.168.10.22:
Pacotes: enviados = 4, recebidos = 0, perdidos = 4 ( perda de 100% ),

C:> eco% errorlevel%
1

user354000
fonte
Alguém pode confirmar que isso é válido para todos os casos de uso?
precisa saber é o seguinte
2
Eu testei a configuração do -wswitch para 2999 contra um IP válido e inválido, adicionando o -n 1switch também. Parece funcionar.
precisa saber é
sim ... isso define o nível de erro se nenhum host no endereço especificado ... obrigado
ZEE
7

Isso ocorre porque o destino está na sua sub-rede local. Se o destino estiver fora da sua sub-rede local, o esperado Request timed out.será visto. No entanto, até destinos inexistentes na sua sub-rede local serão relatados Reply from x.x.x.x: Destination host unreachable.. Como esta publicação do whirlpool explica, tudo depende se é o primeiro salto que atingiu o tempo limite - e executar ping na sub-rede local é apenas um salto. Aparentemente, é por design que o nível de erro é definido para 0quando qualquer resposta é recebida e host unreachableconta como resposta.


Soluções alternativas

Analisando a pingsaída comfindstr

Fonte: http://forums.techguy.org/7318331-post3.html

A seguir, o ping será feito uma vez ( ping -n 1). O %1é o primeiro parâmetro passado para o arquivo em lotes. A variável attribé definida dependendo se o destino responde ou não.

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

Utilitário separado

Há um utilitário interessante chamado vivo . Eu não tentei e foi lançado em 2002, portanto, talvez nem funcione no Windows 7. No entanto, se funcionar, definirá o nível de erro como 2 quando o host de destino estiver inacessível. Eu realmente não recomendaria isso, no entanto.

Prumo
fonte
+1 para alive, usado há muitos anos também, por esse mesmo motivo.
21712 Bryan
Se a resposta for "Solicitação de ping não foi possível encontrar o host madeup04. Verifique o nome e tente novamente", isso não funcionará, pois está procurando "host inacessível"; portanto, o resultado é "madeup04 está respondendo", o que está errado.
James Jenkins
1
@JamesJenkins Eu assumi que, como na pergunta, a tentativa de ping é contra um endereço IP. Mesmo assim, é uma mudança trivial (adicione outra /Csequência de pesquisa). Dificilmente vale um voto negativo. Como já alterei a resposta, obrigado por apontar isso.
Bob
Ugh ... bem isso é estúpido ... passei metade da minha dia tentando descobrir por que o meu sistema estava relatando um subsistema como online - enquanto ele não estava claramente ...
Matt Clark
2

Isso funciona para mim no 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
Andrew S
fonte