Le ping de Windows 7 n'obtient aucune réponse mais définit le niveau d'erreur à 0

10

À partir d'une machine Windows 7, je lance une commande ping sur l'adresse IP d'une machine éteinte.

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)

Même s'il n'y a pas de réponse, le niveau d'erreur est défini sur 0.

Ce que j'essaie de faire, c'est de déterminer si une machine distante répond au ping. L'un de mes tests consiste à éteindre la machine et à la cingler. Pour une raison quelconque, ping définit errorlevel sur 0.

Doron
la source

Réponses:

8

J'ai également fait face au problème et il a résolu avec la clé " -w 2000 ". Le ping complété par la clé " -w " et le nombre de millisecondes renvoie 1 lorsque l'hôte du sous-réseau local est inaccessible. AFAIK, le nombre de millisecondes doit être inférieur au délai d'expiration après que le sous-système réseau de Windows retourne "Hôte de destination inaccessible".

Sur mon PC (Windows 7):
C:> ping -w 3000 192.168.10.22

Pinging 192.168.10.22 avec 32 octets de données:
réponse de 192.168.10.2: hôte de destination inaccessible.
Réponse de 192.168.10.2: Hôte de destination inaccessible.
Réponse de 192.168.10.2: Hôte de destination inaccessible.
Réponse de 192.168.10.2: Hôte de destination inaccessible.

Statistiques Ping pour 192.168.10.22:
paquets: envoyés = 4, reçus = 4, perdus = 0 ( perte 0% ),

C:> écho% niveau d'erreur%
0

mais

C:> ping -w 2999 192.168.10.22

Pinging 192.168.10.22 avec 32 octets de données: la
demande a expiré.
La demande a expiré.
La demande a expiré.
La demande a expiré.

Statistiques Ping pour 192.168.10.22:
paquets: envoyés = 4, reçus = 0, perdus = 4 ( perte de 100% ),

C:> écho% niveau d'erreur%
1

user354000
la source
Quelqu'un peut-il confirmer que cela est valable pour tous les cas d'utilisation?
user1853181
2
J'ai testé le réglage du -wcommutateur sur 2999 par rapport à une IP valide et non valide en ajoutant également le -n 1commutateur. Cela semble fonctionner.
fyrye
oui ... cela définit le niveau d'erreur si aucun hôte à l'adresse spécifiée ... merci
ZEE
7

En effet, la destination se trouve sur votre sous-réseau local. Si la destination est en dehors de votre sous-réseau local, l'attendu Request timed out.est vu. Cependant, même les destinations inexistantes au sein de votre sous-réseau local signaleront Reply from x.x.x.x: Destination host unreachable.. Comme l' explique ce message sur le tourbillon , tout dépend si c'est le premier saut qui a expiré - et le ping de votre sous-réseau local n'est qu'un seul saut. Apparemment, il est par la conception que le ERRORLEVEL est à 0quand une réponse est reçue, et un host unreachablecompte comme une réponse.


Solutions de contournement

Analyser la pingsortie avecfindstr

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

Les éléments suivants le cingleront une fois ( ping -n 1). Le %1est le premier passé au param fichier batch. La variable attribest définie selon que la destination répond ou non.

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

Utilitaire séparé

Il y a un utilitaire intéressant appelé vivant . Je ne l'ai pas essayé, et il a été publié en 2002, donc il peut même ne pas fonctionner sous Windows 7. Cependant, s'il fonctionne, il définira le niveau d'erreur à 2 lorsque l'hôte de destination est inaccessible. Je ne recommanderais pas vraiment cela, cependant.

Bob
la source
+1 pour alive, utilisé il y a de nombreuses années également, pour cette même raison.
Bryan
Si la réponse est "La requête Ping n'a pas pu trouver l'hôte madeup04. Veuillez vérifier le nom et réessayer" cela ne fonctionne pas, car il recherche "l'hôte inaccessible", donc votre résultat est "madeup04 répond", ce qui est faux.
James Jenkins
1
@JamesJenkins J'ai fait l'hypothèse que, comme dans la question, la tentative de ping est dirigée contre une adresse IP. Même alors, c'est un changement trivial (ajoutez une autre /Cchaîne de recherche). Vaut à peine un downvote. En l'état, j'ai modifié la réponse, alors merci de l'avoir signalé.
Bob
Ugh ... eh bien c'est stupide ... J'ai passé la moitié de ma journée à essayer de comprendre pourquoi mon système signalait un sous-système comme étant en ligne - alors que ce n'était clairement pas le cas ...
Matt Clark
2

Cela fonctionne pour moi sur 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
la source