it-swarm.com.de

So überprüfen Sie, ob Ping in einer Batchdatei geantwortet hat oder nicht

Ich möchte kontinuierlich einen Server anpingen und ein Meldungsfeld anzeigen, wenn er antwortet, d. H. Der Server ist zurzeit inaktiv. Ich möchte es durch Batchdatei machen.

Ich kann ein Meldungsfeld wie hier gezeigt anzeigen Ein Popup Meldungsfeld aus einer Windows-Batchdatei anzeigen - /

und kann kontinuierlich durch ping 

ping <servername> -t

Aber wie überprüfe ich, ob es geantwortet hat oder nicht?

37
IsmailS

Das folgende checklink.cmd-Programm ist ein guter Anfang. Es beruht auf der Tatsache, dass Sie einen Single-Shot-Ping ausführen können und dass die Ausgabe bei Erfolg die Zeile enthält:

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

Indem Sie die Token 5 und 7 extrahieren und prüfen, ob sie "Received" und "1," sind, können Sie den Erfolg feststellen.

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=down
for /f "tokens=5,6,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%b"=="xunreachable." goto :endloop
    if "x%%a"=="xReceived" if "x%%c"=="x1,"  set state=up
)
:endloop
echo.Link is !state!
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal

Rufen Sie es mit dem Namen (oder der IP-Adresse) an, den Sie testen möchten:

checklink 127.0.0.1
checklink localhost
checklink nosuchaddress

Beachten Sie, dass Sie, wenn Ihr Gebietsschema nicht Englisch ist, Received durch das entsprechende Schlüsselwort in Ihrem Gebietsschema ersetzen müssen, z. B. recibidos für Spanisch. Führen Sie einen Test-Ping aus, um herauszufinden, welches Keyword in Ihrem Gebietsschema verwendet wird.


Um Sie nur zu benachrichtigen, wenn sich der Status ändert , können Sie Folgendes verwenden:

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=down
for /f "tokens=5,7" %%a in ('ping -n 1 !ipaddr!') do (
    if "x%%a"=="xReceived" if "x%%b"=="x1," set state=up
)
if not !state!==!oldstate! (
    echo.Link is !state!
    set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal

Wie Gabe in einem Kommentar hervorhebt, können Sie jedoch ERRORLEVEL verwenden, damit das Äquivalent dieses zweiten Skripts oben wird:

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
set oldstate=neither
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
if not !state!==!oldstate! (
    echo.Link is !state!
    set oldstate=!state!
)
ping -n 2 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
18
paxdiablo

Die Frage war, ob Ping darauf reagiert hat, was dieses Skript tut.

Dies funktioniert jedoch nicht, wenn Sie die Meldung "Host Unreachable" erhalten, da dies ERRORLEVEL 0 zurückgibt und die in diesem Script verwendete Prüfung auf Received = 1 bestanden wird. Host Nicht erreichbar, wenn Ping an Notwork gesendet wurde, der Remote-Host jedoch nicht gefunden wurde.

Wenn ich mich daran erinnere, ob die Überprüfung erfolgreich war, suchen Sie mit TTL nach der Zeichenfolge "TTL".

@echo off
cls
set ip=%1
ping -n 1 %ip% | find "TTL"
if not errorlevel 1 set error=win
if errorlevel 1 set error=fail
cls
echo Result: %error%

Dies funktioniert nicht mit IPv6-Netzwerken, da Ping TTL nicht auflistet, wenn eine Antwort von der IPv6-Adresse empfangen wird.

26
Lukasz

Ich weiß, dass dies ein alter Thread ist, aber ich wollte testen, ob eine Maschine in meinem System installiert ist. Wenn ich das nicht missverstanden habe, funktioniert nichts, wenn mein Router meldet, dass eine Adresse nicht erreichbar ist. Ich verwende eine Batch-Datei anstelle eines Skripts, weil ich auf so ziemlich jeder WIN-Maschine "KISS" wollte. Der Ansatz, den ich verwendete, bestand darin, mehr als einen Ping-Test durchzuführen und "Lost = 0" wie folgt zu testen

ping -n 2 %pingAddr% | find /I "Lost = 0"  
if %errorlevel% == 0 goto OK

Ich habe das nicht rigoros getestet, aber bisher erledigt es mich

5
Bigrog

Ich habe eine Variantenlösung basierend auf dem Beitrag von paxdiablo gemacht

Fügen Sie den folgenden Code in Waitlink.cmd ein

@setlocal enableextensions enabledelayedexpansion
@echo off
set ipaddr=%1
:loop
set state=up
ping -n 1 !ipaddr! >nul: 2>nul:
if not !errorlevel!==0 set state=down
echo.Link is !state!
if "!state!"=="up" (
  goto :endloop
)
ping -n 6 127.0.0.1 >nul: 2>nul:
goto :loop
:endloop
endlocal

Verwenden Sie es beispielsweise aus einer anderen Batchdatei

call Waitlink someurl.com
Net Use o: \\someurl.com\myshare

Der Aufruf von waitlink wird nur zurückgegeben, wenn ein Ping erfolgreich war. Danke an paxdiablo und Gabe. Hoffe das hilft jemand anderem.

1
Jan Lauridsen

Hier ist etwas, was ich gefunden habe:

:pingtheserver
ping %input% | find "Reply" > nul
if not errorlevel 1 (
    echo server is online, up and running.
) else (
    echo Host has been taken down wait 3 seconds to refresh
    ping 1.1.1.1 -n 1 -w 3000 >NUL
    goto :pingtheserver
) 

Beachten Sie, dass ping 1.1.1.1 -n -w 1000 >NUL 1 Sekunde wartet, aber nur funktioniert, wenn er an ein Netzwerk angeschlossen ist

0
Juggler

Einfache Version:

for /F "delims==, tokens=4" %a IN ('ping -n 2 127.0.0.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
echo FAIL
)

)

Aber manchmal scheitert der erste Ping einfach und die zweite Arbeit (oder umgekehrt) oder? Wir möchten also erfolgreich sein, wenn mindestens eine ICMP-Antwort erfolgreich zurückgegeben wurde:

for /F "delims==, tokens=4" %a IN ('ping -n 2 192.168.1.1 ^| findstr /R "^Packets: Sent =.$"') DO (

if %a EQU 2 (
echo Success
) ELSE (
if %a EQU 1 (
echo Success
) ELSE (
echo FAIL
)
)

)
0
damian1baran

Ich hoffe das hilft jemandem. Ich verwende diese Logik, um zu überprüfen, ob die Netzwerkfreigaben reagieren, bevor die einzelnen Pfade geprüft werden. Es sollte DNS-Namen und IP-Adressen behandeln

Ein gültiger Pfad in der Textdatei wäre \192.168.1.2\'Ordner' oder\NAS\'Ordner'

@echo off
title Network Folder Check

pushd "%~dp0"
:00
cls

for /f "delims=\\" %%A in (Files-to-Check.txt) do set Server=%%A
    setlocal EnableDelayedExpansion
        ping -n 1 %Server% | findstr TTL= >nul 
            if %errorlevel%==1 ( 
                ping -n 1 %Server% | findstr "Reply from" | findstr "time" >nul
                    if !errorlevel!==1 (echo Network Asset %Server% Not Found & pause & goto EOF)
            )
:EOF
0
Dan W

Sie können ohne "-t" ping und den Exit-Code des Pings überprüfen. Es meldet einen Fehler, wenn keine Antwort vorliegt.

0
Rotsor