2017-05-13 2 views
2

So vor kurzem meine Internet-Verbindung war wirklich unbefriedigend, so dass ich versuche, so viele Daten wie möglich zu sammeln, wann und für wie viel Zeit die Ausfälle dauern. Ich habe einige "Connectivity-Monitoring" -Programme ausprobiert, aber sie funktionieren nicht so, wie ich es möchte, also habe ich beschlossen, eins zu machen.Überprüfung der Internetkonnektivität mit Batch

Ich bin ein absoluter Noob in Batch aber Sachen für die vergangene Stunde von Googeln kam ich mit auf den Punkt:

SET status=" 

:start_test 
timeout 5 
ping -n 2 -w 700 www.google.com | find "bytes=" 
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet. 

) ELSE (
    SET internet=Not connected to the internet. 
) 
IF %status%==%internet%(
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 
echo ------------------------------------------ 
echo %internet% 
@echo %time% 
echo ------------------------------------------ 
SET status=%internet% 
goto :start_test 

tl; dr- es die Internet-Verbindung überprüft von google.com Schmachten und schreibt eine Massage Jedes Mal, wenn der Internet-Verbindungsstatus ändert sich

aber das Problem ist, dass es funktioniert nicht und ich weiß nicht warum, wenn ich versuche, es zu starten, öffnet die Konsole, geht durch die ersten paar Zeilen und schließt sich .

Hilfe

EDIT: es jetzt funktioniert, ist dies, wie die Datei jetzt aussieht (wie, was Mofi sagte):

@echo off 
SET "status=" 

:start_test 
timeout 5 
ping -n 2 -w 700 www.google.com | find "bytes=" 
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet. 

) ELSE (
    SET internet=Not connected to the internet. 
) 
IF "%status%"=="%internet%" (
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 
echo ------------------------------------------ 
echo %internet% 
@echo %time% 
echo ------------------------------------------ 
SET "status=%internet%" 
goto :start_test 
+0

Sie müssen vorsichtig sein, was Sie überprüfen; Diese Überprüfungen bestimmen nur eine Sache, ob die Maschine Ping-Informationen zurückgibt. Es sagt nichts über warum. Stellen Sie sicher, dass Sie zuerst Ihre Routerprotokolle und Routereinstellungen überprüfen. Sie müssen drei Dinge in dem Snippet ändern, das Sie gepostet haben: SET Status = "' bis 'SET" Status = "', 'IF% status% ==% internet% (' zu 'IF"% status% "= = "% internet%" ('und' SET status =% internet% 'bis' SET "status =% internet%" '. – Compo

+0

FYI, es scheint, dass die Änderungen, die du in deiner bearbeiteten Version vorgenommen hast, genau die drei Änderungen sind Ich habe Sie in meinem Kommentar angegeben. Aus diesem Grund ist es ein wenig unfair, das dem Mofi zuzuschreiben. – Compo

Antwort

0

Die Antwort auf Batch file comparison of variable with constant fails in ersten Kapitel erläutert, wie ein debuggen Batch-Datei von nicht Doppelklicken Sie darauf, aber durch Öffnen eines Eingabeaufforderungsfensters und führen Sie die Batch-Datei von innerhalb dieses Fensters, um Fehlermeldungen durch Syntaxfehler zu sehen, die in beenden Batch-Dateiausführung führen.


SET status=" 

Diese Linie definiert die Umgebungsvariable mit dem Wert status".

Ich nehme an, Sie

SET "status=" 

löschen eine vielleicht vorhandene Umgebungsvariable status, verwenden wollte, aber sie codiert diese falsch durch den ersten doppelten Anführungszeichen weggelassen.


Der Befehl PINGError--0 auf Erfolg und 1 auf einem Fehler wie Ziel pinged konnte nicht festlegt.

Aber aus irgendeinem unbekannten Grund wollen Sie nicht den Exit-Code von PING und stattdessen analysieren Ausgabe von PING von FINDEN und bewerten die Exit-Code von FIND zu bewerten. Die Verwendung von FIND ist meiner Meinung nach hier völlig unnötig.


Die Auswertung des Exit-Code von FIND wäre schon genug sein, um auch weiterhin in Abhängigkeit von diesem Exit-Code, aber zwei verschiedene Strings mit Leerzeichen sind zu einer Umgebungsvariablen zugewiesen, je nach Wert von Error-.


Ein weiteres IF wird Zweig verwendet, um mehr oder weniger abhängig von Exit-Code von PING.

Hier ist der Fehler, der die Ausführung der Stapelverarbeitung aufgrund eines Syntaxfehlers verursacht.

IF %status%==%internet%(

erweitert ersten Vergleich zu

IF " == Connected to the internet. (

oder

IF " == Not connected to the internet. (

und beide Leitungen nicht korrekt von Windows-Befehlsinterpreter durch eine Syntaxfehlermeldung ausgegeben angegeben verarbeitet werden können, um Konsole, die gelesen werden kann, wenn die Batch-Datei in einem Eingabeaufforderungsfenster ausgeführt wird.

Vergleicht Strings Befehl Trennzeichen SPACE enthält, erfordert sowohl Strings umschließt in doppelten Anführungszeichen zu vergleichen, dh Nutzung:

IF "%status%" == "%internet%" (

Aber selbst wäre dies hier nicht helfen, weil der Umgebungsvariablen status mit einem einzelnen Anführungszeichen definiert was dazu führt, dass die linke Zeichenfolge schließlich auf dem ersten Vergleich """ liegt, was wiederum zu einem Syntaxfehler führt.

Hinweis: Die doppelten Anführungszeichen sind im Zeichenfolgenvergleich enthalten.


Der unten Block ist auch interessant:

IF %status%==%internet%(
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 

Der ELSE Zweig ist mit den Leitungen für das Springen, die in jedem Fall durchgeführt werden würden, wenn die ELSE Zweig überhaupt nicht existieren würde . So ist der komplette ELSE Zweig völlig unnötig.


Aus all diesen Gründen schlage ich vor, die Batch-Code zu vereinfachen:

@echo off 
set "Status=2" 
:ConnectionTest 
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul 
if errorlevel 1 (
    if not "%Status%" == "1" echo %TIME% Not connected to the internet. 
    set "Status=1" 
) else (
    if not "%Status%" == "0" echo %TIME% Connected to the internet. 
    set "Status=0" 
) 
%SystemRoot%\System32\timeout.exe /T 5 >nul 
goto ConnectionTest 

Es wäre möglich, hier alle doppelte Anführungszeichen und Verwendung wegzulassen:

@echo off 
set Status=2 
:ConnectionTest 
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul 
if errorlevel 1 (
    if not %Status% == 1 echo %TIME% Not connected to the internet. 
    set Status=1 
) else (
    if not %Status% == 0 echo %TIME% Connected to the internet. 
    set Status=0 
) 
%SystemRoot%\System32\timeout.exe /T 5 >nul 
goto ConnectionTest 

Zum Verständnis die verwendeten Befehle und wie sie funktionieren, öffnen ein Eingabeaufforderungsfenster, führen dort die folgenden Befehle aus und lesen alle Hilfeseiten, die für jeden Befehl angezeigt werden, sehr sorgfältig durch.

  • echo /?
  • goto /?
  • if /?
  • ping /?
  • set /?
  • timeout /?

Lesen Sie auch die Microsoft Artikel über Using Command Redirection Operators.

Verwandte Themen