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
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.
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
.
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.
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"
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
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
ping 198.168.57.98 && echo Success || echo failed
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!
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.
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
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
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
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.