web-dev-qa-db-fra.com

Réponse ping ERRORLEVEL par lot

J'essaie d'utiliser un fichier de commandes pour confirmer une connexion réseau à l'aide de ping. Je veux faire un lot, puis imprimer si le ping a réussi ou non. Le problème est qu'il affiche toujours «échec» lorsqu'il est exécuté en tant que lot. Voici le code: 

@echo off
cls
ping racer | find "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause

"racer" est le nom de mon ordinateur. Mon ordinateur envoie une requête ping afin d'éliminer la variable d'une mauvaise connexion. Comme je l'ai dit précédemment, le lot entraîne toujours un échec. Curieusement, le programme fonctionne bien si je copie le code dans la commande Invite. Est-ce que quelqu'un sait pourquoi le programme fonctionne bien dans l'invite de commande mais ne fonctionne pas comme un lot? Merci 

10
LastStar007

Je ne sais pas exactement quelle est l'interaction entre FIND et la définition du niveau d'erreur, mais vous pouvez le faire assez facilement:

@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%

Ceci imprime 0 si le ping a échoué, 1 s'il a réussi. Je l'ai fait rechercher seulement "0% de perte" (pas spécifiquement 4 pings) afin que le nombre de pings puisse être personnalisé.

Le signe de pourcentage a été doublé afin qu'il ne soit pas confondu avec une variable à remplacer.

L'astuce FOR sert simplement à définir la sortie d'une commande comme valeur d'une variable d'environnement.

2
Jon

Méthode de vérification d'erreur ping plus fiable:

@echo off
set "Host=192.168.1.1"

ping -n 1 "%Host%" | findstr /r /c:"[0-9] *ms"

if %errorlevel% == 0 (
    echo Success.
) else (
    echo FAILURE.
)

Cela fonctionne en vérifiant si une chaîne telle que 69 ms ou 314ms est imprimée par ping

(Les versions traduites de Windows peuvent imprimer 42 ms (avec l'espace), nous vérifions donc cela.)

Raison:

D'autres propositions, telles que la correspondance time= ou TTL, ne sont pas aussi fiables, car les adresses IPv6 envoyées au ping ne s'affichent pas TTL (du moins sur ma machine Windows 7) et les versions traduites de Windows peuvent afficher une version traduite de la chaîne time=. De plus, non seulement time= peut être traduit, mais il peut parfois s'agir de time< plutôt que de time=, comme dans le cas de time<1ms.

21
Jelle Geerts

Le test de perte à 0% peut donner un faux positif, dans ce scénario: Disons que vous avez normalement un lecteur réseau sur une adresse IP et que vous voulez savoir s'il est allumé ou non. 

Si ce lecteur est désactivé et que vous envoyez une requête ping à une adresse IP, l'adresse IP à partir de laquelle vous envoyez une requête ping répondra:
Answer from your_own_IP-address: target Host not reachable
... 0% loss
 

Il serait peut-être préférable d’utiliser if exist ou if not exist sur cet emplacement réseau. 

4
RolfBly

Si tu devais 

echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"

vous verriez le % est dépouillé. Vous devez y échapper car % a une signification particulière dans un fichier batch:

"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss),"

Cependant, il est plus simple d’utiliser TTL comme indication de succès;

.. | find "TTL"
4
Alex K.

La solution la plus simple à laquelle je puisse penser est:

set error=failure
ping racer -n 1 -w 100>nul 2>&1 && set error=success

Bien sûr, -w doit être ajusté si la liaison est lente (100 ms est peut-être trop court pour l'accès réseau à distance ;-))

cordialement

1
Martin Binder

Une autre variation sans utiliser aucune variable

ping racer -n 1 -w 100>nul || goto :pingerror
...

:pingerror
echo Host down
goto eof

:eof
exit /b
1
Toni Lazazzera
ping 198.168.57.98 && echo Success || echo failed
1
Chandan
set ErrorLevel=1
(ping example.com -n 1 && set ErrorLevel=0)>nul

ErrorLevel est 0 si example.com est en ligne, 1 sinon.

NOTE: Testé sur Win8 uniquement!

0
Fabio Iotti

ping a une valeur de sortie errorlevel. Le succès est 0, l'échec est 1. Faites ceci:

C:\>ping 4.2.2.2

Pinging 4.2.2.2 with 32 bytes of data:

Reply from 4.2.2.2: bytes=32 time=28ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57
Reply from 4.2.2.2: bytes=32 time=30ms TTL=57
Reply from 4.2.2.2: bytes=32 time=29ms TTL=57

Ping statistics for 4.2.2.2:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 28ms, Maximum = 30ms, Average = 29ms

C:\>echo %errorlevel%
0

C:\>ping foo.bar
Ping request could not find Host foo.bar. Please check the name and try again.

C:\>echo %errorlevel%
1

Comme vous pouvez le constater, il n’ya pas besoin de tout cet excès de script. 

0
Mr. Pink

D'après la note d'Alex K, cela fonctionne pour moi sous Windows 7:

@echo off
setlocal enableextensions enabledelayedexpansion

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

:HOSTUP
echo Host UP %1
GOTO EOF

:HOSTDOWN
echo Host DOWN %1
GOTO EOF

:EOF
exit /B
0
Andrew S

Je devais réinitialiser une connexion wifi car elle posait problème. C'était ma solution rapide.

@echo off Rem Test ping Microsoft Windows 10 vers passerelle. Rem Exécuter le fichier de commandes à partir d'une invite de commande administrative.

cls : à partir de Rem Envoyez un ping à la passerelle. Ecrire les résultats dans un fichier. Ping 192.168.1.1 -n 1> pingtest.txt

Rem Rechercher inaccessible dans le fichier. c:\windows\system32\findstr.exe "inaccessible" pingtest.txt

Rem errorlevel 0 réinitialise la carte si 1, puis attendez 10 minutes et testez à nouveau Si% errorlevel% == 1 attend en attente

Rem inaccessible a été trouvé réinitialiser l'adaptateur.

Rem écrit la date et l'heure auxquelles la réinitialisation a été effectuée. Echo Date de réinitialisation:% date% heure:% heure% >> resettimes.txt

Rem question interface netsh show interface pour trouver le nom de votre adaptateur à réinitialiser Rem mon adaptateur est "wi-fi"

interface de jeu d'interface netsh "wi-fi" désactiver délai d'attente/t 5 interface de jeu d'interface netsh "wi-fi" attente en ligne 10 minutes " timeout/t 600 commencer à partir

0
NickS

Oui, ping ne retourne pas le niveau d'erreur correct. Pour vérifier la connexion réseau et l'ordinateur, j'ai utilisé "net view nom_ordinateur" puis vérifié% errorlevel% - simple et facile

0
Brian

Tout d'abord

>@echo off
>for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
>echo %MATCHES%

Ne marche pas. S'il échoue, il détectera 0%, car il en possède 0. En cas d'échec, il ne fonctionne pas non plus, car il subira une perte de 100%, ce qui signifie qu'il aura retrouvé la perte de 0%. partie derrière le 10 10 (0% de perte)

Demandez-lui de détecter une perte de 100% comme suit:

>for /f %%i in ('ping  -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i

Errorlevel est peut-être un peu foiré, mais cela fonctionne à merveille:

>if '%check%'=='1' goto fail
>if '%check%'=='0' echo %pc% is online.&goto starting

1 signifie qu'il a échoué 0 signifie qu'il a réussi

Dans mon script, utilisez des liens. Goto fail ira à: fail dans mon script, ce qui m'indiquera que% pc% (dont l'entrée sera entrée par l'utilisateur au début) est hors ligne et ira pour un autre courir.

>:fail
>color 0c
>title %pc% is offline
>echo %pc% is offline
>PING -n 6 127.0.0.1>nul
>goto choice

J'espère que ça aide.

0
Justin Duijn