El ping de Windows 7 no recibe respuesta pero establece el nivel de error en 0

10

Desde una máquina con Windows 7, hago ping a la dirección IP de una máquina apagada.

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)

Aunque no hay respuesta, el nivel de error se establece en 0.

Lo que estoy tratando de hacer es averiguar si una máquina remota responde al ping. Una de mis pruebas es apagar la máquina y hacer ping. Por alguna razón, ping establece el nivel de error en 0.

Doron
fuente

Respuestas:

8

También enfrenté el problema y se resolvió con la clave " -w 2000 ". Ping suplementado con la clave " -w " y el número de milisegundos devuelve 1 cuando no se puede acceder al host en la subred local. AFAIK, el número de milisegundos debe ser menor que el tiempo de espera después de que el subsistema de red de Windows devuelva "Host de destino inalcanzable".

En mi PC (Windows 7):
C:> ping -w 3000 192.168.10.22

Pinging 192.168.10.22 con 32 bytes de datos:
respuesta desde 192.168.10.2: host de destino inalcanzable.
Respuesta de 192.168.10.2: Host de destino inalcanzable.
Respuesta de 192.168.10.2: Host de destino inalcanzable.
Respuesta de 192.168.10.2: Host de destino inalcanzable.

Estadísticas de ping para 192.168.10.22:
Paquetes: Enviado = 4, Recibido = 4, Perdido = 0 ( 0% de pérdida ),

C:> echo% errorlevel%
0

pero

C:> ping -w 2999 192.168.10.22

Pinging 192.168.10.22 con 32 bytes de datos: la
solicitud agotó el tiempo de espera.
Tiempo de espera agotado.
Tiempo de espera agotado.
Tiempo de espera agotado.

Estadísticas de ping para 192.168.10.22:
paquetes: enviados = 4, recibidos = 0, perdidos = 4 ( pérdida del 100% ),

C:> echo% errorlevel%
1

usuario354000
fuente
¿Alguien puede confirmar que esto es válido para todos los casos de uso?
user1853181
2
Probé establecer el -winterruptor en 2999 contra una IP válida e inválida agregando el -n 1interruptor también. Parece funcionar.
fyrye
sí ... esto establece el nivel de error si no hay un host en la dirección especificada ... gracias
ZEE
7

Esto se debe a que el destino está en su subred local. Si el destino está fuera de su subred local, Request timed out.se ve lo esperado . Sin embargo, incluso los destinos inexistentes dentro de su subred local informarán Reply from x.x.x.x: Destination host unreachable.. Como lo explica esta publicación de hidromasaje , todo depende de si es el primer salto que se agotó el tiempo de espera, y hacer ping a su subred local es solo un salto. Aparentemente, es por diseño que el nivel de error se establece 0cuando se recibe cualquier respuesta, y host unreachablecuenta como respuesta.


Soluciones

Analizando la pingsalida confindstr

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

Lo siguiente lo hará ping una vez ( ping -n 1). El %1es el primer parámetro pasado al archivo por lotes. La variable attribse establece dependiendo de si el destino responde o no.

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

Utilidad separada

Hay una utilidad interesante llamada viva . No lo he probado, y se lanzó en 2002, por lo que es posible que ni siquiera funcione en Windows 7. Sin embargo, si funciona, establecerá el nivel de error en 2 cuando no se pueda acceder al host de destino. Sin embargo, realmente no recomendaría esto.

Beto
fuente
+1 para alive, usado hace muchos años también, por esta misma razón.
Bryan
Si la respuesta es "La solicitud de ping no pudo encontrar el host madeup04. Verifique el nombre e intente nuevamente" esto no funciona, porque está buscando "host inalcanzable", por lo que su resultado es "madeup04 está respondiendo", lo cual es incorrecto.
James Jenkins
1
@JamesJenkins Supuse que, como en la pregunta, el intento de ping está en contra de una dirección IP. Incluso entonces, es un cambio trivial (agregue otra /Ccadena de búsqueda). Apenas vale la pena un voto negativo. Tal como están las cosas, he modificado la respuesta, así que gracias por señalarlo.
Bob,
Ugh ... bueno, eso es estúpido ... Pasé la mitad de mi día tratando de descubrir por qué mi sistema informaba que un subsistema estaba en línea, mientras que claramente no era ...
Matt Clark
2

Esto funciona para mí en 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
fuente