Ich versuche eine Batch-Datei zu verwenden, um eine Netzwerkverbindung mit Ping zu bestätigen. Ich möchte Batch ausführen und dann drucken, ob der Ping erfolgreich war oder nicht. Das Problem ist, dass es immer als Fehler angezeigt wird, wenn es als Stapel ausgeführt wird. Hier ist der 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
"Rennfahrer" ist der Name meines Computers. Ich lasse meinen Computer selbst pingen, damit ich die Variable einer schlechten Verbindung beseitigen kann. Wie ich schon sagte, führt die Charge immer zum Versagen. Seltsamerweise funktioniert das Programm gut, wenn ich den Code in den Befehl Prompt kopiere. Weiß jemand, warum das Programm in der Eingabeaufforderung einwandfrei funktioniert, aber nicht als Stapel funktioniert? Vielen Dank
Ich bin mir nicht ganz sicher, was die Interaktion zwischen FIND
und dem Festlegen der Fehlerstufe ist, aber Sie können dies ganz leicht tun:
@echo off
for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
echo %MATCHES%
Dies gibt 0
aus, wenn der Ping fehlgeschlagen ist, 1
, falls er erfolgreich war. Ich habe nur nach "0% loss" gesucht (nicht speziell nach 4 Pings), damit die Anzahl der Pings angepasst werden kann.
Das Prozentzeichen wurde verdoppelt, damit es nicht für eine Variable gehalten wird, die ersetzt werden sollte.
Der Trick FOR
dient einfach dazu, die Ausgabe eines Befehls als Wert einer Umgebungsvariablen zu setzen.
Eine zuverlässigere ping
Fehlerprüfungsmethode:
@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.
)
Dies funktioniert, indem geprüft wird, ob eine Zeichenfolge wie 69 ms
oder 314ms
von ping
gedruckt wird.
(Übersetzte Versionen von Windows können 42 ms
(mit dem Leerzeichen) drucken, daher überprüfen wir das.)
Grund:
Andere Vorschläge, wie z. B. das Abgleichen von time=
oder TTL
, sind nicht so zuverlässig, da das Pinging von IPv6-Adressen nicht TTL
angezeigt wird (zumindest nicht auf meinem Windows 7-Computer) und übersetzte Versionen von Windows möglicherweise eine übersetzte Version der Zeichenfolge time=
anzeigen. Außerdem kann nicht nur time=
übersetzt werden, sondern manchmal auch time<
und nicht time=
, wie im Fall von time<1ms
.
Das Testen auf einen Verlust von 0% kann in diesem Szenario ein falsch positives Ergebnis ergeben: Angenommen, Sie haben normalerweise ein Netzlaufwerk für eine IP-Adresse, und Sie möchten herausfinden, ob es eingeschaltet ist oder nicht.
Wenn das Laufwerk ausgeschaltet ist und Sie eine IP-Adresse anpingen, antwortet die IP-Adresse, von der aus Sie den Ping ausführen: Answer from your_own_IP-address: target Host not reachable
... 0% loss
Verwenden Sie if exist
oder if not exist
an diesem Netzwerkstandort möglicherweise besser.
Wenn du es wärst
echo "Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),"
sie würden sehen, dass der %
entfernt wird. Sie müssen es entziehen, da %
innerhalb einer Batchdatei eine besondere Bedeutung hat:
"Packets: Sent = 4, Received = 4, Lost = 0 (0%% loss),"
Es ist jedoch einfacher, TTL als Hinweis auf Erfolg zu verwenden.
.. | find "TTL"
Die einfachste Lösung dazu kann ich mir vorstellen:
set error=failure
ping racer -n 1 -w 100>nul 2>&1 && set error=success
-W muss natürlich angepasst werden, wenn auf einer langsamen Verbindung (100ms über Dialup zu kurz sind ;-))
grüße
Eine weitere Variante ohne Verwendung einer Variablen
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
Ich mochte das Konzept der Suche in den Ping-Ergebnissen, aber warum nicht einfach die Antwort von der Adresse finden, die gepingt wird?
Im folgenden Beispiel gebe ich eine IP-Adresse als Variable ein, PINGE diese IP und suche dann mit dem Befehl FIND nach dieser Variablen in der Antwortzeichenfolge. Wenn die Antwortzeichenfolge etwas anderes als die richtige IP enthält, wird ein Fehler gemeldet.
Wenn Sie möchten, können Sie einfach den Wert von ERRORLEVEL aus der FIND lesen. Das gibt Ihnen einen verlässlichen Wert, mit dem Sie arbeiten können.
@echo off
Set /P IPAdd=Enter Address:
cls
ping %IPAdd% | find "Reply from %IPAdd%:"
if not errorlevel 1 set error=success
if errorlevel 1 set error=failure
cls
echo Result: %error%
pause
set ErrorLevel=1
(ping example.com -n 1 && set ErrorLevel=0)>nul
ErrorLevel
ist 0
, wenn example.com online ist, andernfalls 1
.
HINWEIS: Nur unter Win8 getestet!
ping hat einen Ausgabewert für den Errorlevel. Erfolg ist 0, Misserfolg ist 1. Tun Sie dies einfach:
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
Wie Sie sehen, ist dieser Skript-Overkill nicht erforderlich.
Basierend auf der Notiz von Alex K. funktioniert das für mich unter 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
Ich musste eine WLAN-Verbindung zurücksetzen, da Probleme aufgetreten sind. Dies war meine schnelle Lösung.
@echo off Rem Microsoft Windows 10-Ping-Test an Gateway. Rem Führen Sie die Stapeldatei über eine Verwaltungsbefehlsaufforderung aus.
cls : Starten von Rem Senden Sie einen Ping an das Gateway. Schreiben Sie die Ergebnisse in eine Datei. Ping 192.168.1.1 -n 1> pingtest.txt
Rem Suche nach nicht erreichbar in der Datei. c:\windows\system32\findstr.exe "nicht erreichbar" pingtest.txt
Rem errorlevel 0 setze den Adapter zurück, wenn 1, dann warte 10 Minuten und teste erneut , Ob% errorlevel% == 1 wartet
Rem nicht erreichbar wurde gefunden, setzen Sie den Adapter zurück.
Rem schreiben Sie Datum und Uhrzeit des Zurücksetzens. Echo Datum zurücksetzen:% Datum% Zeit:% Zeit% >> resettimes.txt
Rem-Ausgabe Netsh-Schnittstelle Show-Schnittstelle, um den Namen des Adapters zu finden, der zurückgesetzt werden soll Rem mein Adapter ist "Wi-Fi"
netsh interface set interface "Wi-Fi" deaktivieren timeout/t 5 netsh Interface Set-Schnittstelle "Wi-Fi" aktivieren : Warten echo "Es ist Online-Wartezeit 10 Minuten " Timeout/t 600 geht los
Ja, ping schlägt fehl, den korrekten Fehlerspiegel zurückzugeben. Um die Netzwerkverbindung und den Computer zu überprüfen, habe ich "net view computername" verwendet und dann% errorlevel% geprüft - einfach und problemlos
Zuerst
>@echo off
>for /f %%i in ('ping racer ^| find /c "(0%% loss)"') do SET MATCHES=%%i
>echo %MATCHES%
Funktioniert nicht. Wenn es nicht fehlschlägt, erkennt es 0%, weil es 0% hat. Wenn es fehlschlägt, funktioniert es auch nicht, weil es 100% Verlust hat, was bedeutet, dass es 0% Verlust gefunden hat Teil hinter den 10 10 (0% Verlust)
Lassen Sie es für 100% Verlust feststellen:
>for /f %%i in ('ping -n 1 -l 1 %pc% ^| find /c "(100%% loss)"') do SET check=%%i
Errorlevel ist vielleicht ein bisschen durcheinander, funktioniert aber wie ein Zauber:
>if '%check%'=='1' goto fail
>if '%check%'=='0' echo %pc% is online.&goto starting
1 bedeutet, dass es fehlgeschlagen ist 0 bedeutet, dass es erfolgreich war
In meinem Skript befinden sich Links. Gehe zu Fail geht zu: Fehler in meinem Skript, das meldet, dass% pc% (was ich als Benutzereingabe am Anfang habe) offline ist und für ein anderes gehen wird Lauf.
>:fail
>color 0c
>title %pc% is offline
>echo %pc% is offline
>PING -n 6 127.0.0.1>nul
>goto choice
Ich hoffe das hilft.