Ping do windows 7 não recebe resposta, mas define errorlevel como 0

10

De uma máquina com Windows 7, faço ping de 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 resposta, o nível de erro é definido como 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 fazer o ping. Por algum motivo, o ping define errorlevel como 0 .

    
por Doron 23.03.2012 / 09:55

3 respostas

7

Isso ocorre porque o destino está na sua sub-rede local. Se o destino estiver fora de sua sub-rede local, o Request timed out. esperado será visto. No entanto, até destinos inexistentes na sua sub-rede local reportarão Reply from x.x.x.x: Destination host unreachable. . Como este post de hidromassagem explica, tudo depende se é o primeiro salto que expirou - e pingar sua sub-rede local é apenas um único salto . Aparentemente, é por design que o errorlevel é definido como 0 quando qualquer resposta é recebida, e host unreachable conta como resposta.

Soluções alternativas

Analisando ping de saída com findstr

Fonte: link

A seguir, o ping será executado uma vez ( ping -n 1 ). O %1 é o primeiro param 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

Existe um utilitário interessante chamado vivo . Eu não tentei, e foi lançado em 2002, por isso pode nem funcionar no Windows 7. No entanto, se funcionar, ele irá definir o errorlevel para 2 quando o host de destino estiver inacessível. Eu não recomendaria isso, no entanto.

    
por 23.03.2012 / 10:49
7

Eu também enfrentei o problema e ele foi resolvido com a chave " -w 2000 ". O ping complementado com a chave " -w " e o número de milissegundos retornam 1 quando o host na sub-rede local está inacessível. AFAIK, o número de milissegundos deve ser menor que o tempo limite depois que 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

Ping 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 ( 0% de perda ),

C: > echo% errorlevel%
0

mas

C: > ping -w 2999 192.168.10.22

Ping 192.168.10.22 com 32 bytes de dados:
Solicitação expirou.
Solicitação expirou.
Solicitação expirou.
Solicitação expirou.

Estatísticas de ping para 192.168.10.22:
    Pacotes: Enviados = 4, Recebidos = 0, Perdidos = 4 ( 100% de perda ),

C: > echo% errorlevel%
1

    
por 06.08.2014 / 15:06
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
    
por 11.12.2012 / 18:53