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?
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
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.
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
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.
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
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
)
)
)
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
Sie können ohne "-t" ping und den Exit-Code des Pings überprüfen. Es meldet einen Fehler, wenn keine Antwort vorliegt.