wake-up-neo.net

Batch ERRORLEVEL Ping-Antwort

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 

10
LastStar007

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.

2
Jon

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.

21
Jelle Geerts

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. 

4
RolfBly

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"
4
Alex K.

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

1
Martin Binder

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
1
Toni Lazazzera
ping 198.168.57.98 && echo Success || echo failed
1
Chandan

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
0
Rod
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!

0
Fabio Iotti

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. 

0
Mr. Pink

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
0
Andrew S

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

0
NickS

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

0
Brian

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.

0
Justin Duijn