2017-07-23 2 views
2

Suchen Sie nach findstr, um es zu finden, "0% Verlust" nach einem Ping-Befehl. Vielleicht ein Array von etwas bis zu "50% Verlust".Bessere Möglichkeit, findstr zu verwenden, um Paketverlust zu erhalten, Batch

Dies ist zum Überprüfen und Sicherstellen, dass eine Verbindung zum Internet zu 100% hergestellt ist, bevor Sie etwas online starten.

Derzeit ist es strukturiert:

ping %ip% -n 3 -w 3000 | findstr "0% loss" 
pause 
goto Starting 

Es ist derzeit findstr ignorieren ist und egal, was es ablehnt, zu finden, was ich suche

Ideal wäre es fließen wie:

ping %ip% -n 3 -w 3000 | findstr "0% loss" || goto Echo 
pause 
goto Starting 
:echo 
Could not find "0% loss" 
pause 

Und ich habe es versucht, es wird Echo, aber sogar mit 100% Verbindung, so dass es eindeutig nicht funktioniert, wie ich es gerne würde.

Gibt es eine bessere Möglichkeit,% Paketverlust zu finden?

Oder

Gibt es eine bessere Art und Weise Internetverbindung zu testen, da ping funktioniert nicht, wenn ein Gerät vollständig offline ist.

+0

Was ist es für Sie zeigen? Was du hast, funktioniert gut für mich. – SomethingDark

+0

@SomethingDark für mich ist es nichts anspruchsvolle '@echo off Titel Restart Farbe 0A cls : start Cls set ip = www.google.com : Pingcheck Echo Checking ping .. Timeout/t 3 ping% ip% -n 5 -w 3000 | findstr "0% Verlust" || goto Verlust Pause: Echo echo Wir haben 0 Paketverlust in% ip% auf% date% auf% time% Pause goto starten: Verlust Echo Wir einigen Paketverlust gefunden. pause' es wird ausgeführt und melden 0% packetloss unabhängig davon, was der ** tatsächliche ** Internet-Status ist. – Cinn

+0

@Cinn: Warum extrahieren Sie nicht die Pakete "Gesendet" und "Empfangen" und berechnen den prozentualen Verlust selbst? – Azeem

Antwort

4

Der Suchbegriff, nach dem Sie suchen, ist zu breit. Wenn Sie findstr für "0% Verlust" prüfen, nehmen Sie versehentlich auch "10 0% Verlust" auf. Glücklicherweise setzt ping den Paketverlust in Klammern, sodass Sie einfach die öffnende Klammer in die Suchzeichenfolge einfügen können.

@echo off 
title Restart 
color 0A 
cls 

:start 
Cls 
set ip=www.google.com 

:Pingcheck 
echo Checking ping.. 
timeout /t 3 
ping %ip% -n 5 -w 3000 | findstr /C:"(0% loss" || goto Loss 
pause 

:NoLoss 
echo We found 0 packet loss, at %ip% on %date% at %time% 
pause 
goto start 

:Loss 
echo We found some packet loss. 
pause 

Ich habe mich verändert auch den Namen des :Echo Label weil echo bereits ein Befehl ist und es auch ein Label verwirrend wäre sein.

+0

Dies scheint nicht zu ping nichts. In der Tat scheint es den Ping alle zusammen überspringt und geht direkt zu ': Verlust' – Cinn

+0

Es leitet die Ausgabe von' Ping' zu findstr, die dann ** nur ** Zeilen anzeigt, die die Zeichenfolge 'enthalten (0% Verlust Da "ping www.google.com" standardmäßig IPV6 verwendet und das aus irgendeinem Grund nicht funktioniert, stimmt kein Teil des Befehls ping mit der Suchzeichenfolge überein, sodass nichts angezeigt wird. Das Skript funktioniert genau so, wie es soll , denn so funktioniert 'findstr' und du sagtest nichts über die Notwendigkeit, die Ausgabe von ping zu sehen. – SomethingDark

+0

das macht mehr Sinn. Ich nehme an, es wird seinen Zweck richtig mit dem '| findstr/C: ausführen (0% Verlust "hinzugefügt? Erinnern Sie sich den ganzen Punkt von diesem ist, eine Verbindung zu dem äußeren Netz zu erkennen und ein Programm zu starten, das darauf basiert, wahr zu sein. – Cinn

2

Sie können den Ping-Status auch mit wmi überprüfen. Der Vorteil dieser Methode ist, dass sie beim ersten Fehler goto :fail ist und nicht ihre verlorene Ursache für den Abschluss von 5 Ping-Versuchen fortsetzt, während sie gleichzeitig eine einfache Möglichkeit bietet, die durchschnittliche Antwortzeit beizubehalten. Es verwendet set /a, um zu überprüfen, ob das Ergebnis der WMI-Abfrage einen numerischen Wert enthält. Wenn ja, pass auf. Wenn nicht, scheitern.

@echo off & setlocal 

set "host=www.google.com" 

echo Pinging %host%... 

for /L %%I in (1,1,5) do (
    for /f "delims=" %%x in (
     'wmic path win32_pingstatus where "address='%host%' and timeout=3000"^ 
     get ResponseTime /value ^| find "="' 
    ) do (
     2>NUL set /a "%%x, avg += ResponseTime" || goto fail 
    ) 
) 

set /a "avg /= 5" 
echo 0%% packet loss. Woo. Average response time was %avg%ms. 
exit /b 

:fail 
echo Aw snap. Packet loss. 
+0

Es ist leider nicht möglich, den Echoverlust von 0%% zu lesen. Umwerben. Die durchschnittliche Antwortzeit war% avg% ms.' Es schließt die Datei einfach, wenn kein PL vorhanden ist oder PL vorhanden ist. Dieser Satz wird in Verbindung mit diesen arbeiten: ': Echo Verbindung hergestellt wird gestartet ... Start Server starten server.bat Echo starten Erfolgreiche goto Starten' Gibt es einen Weg, um den obigen Code auszulösen^mit was du gepostet hast? – Cinn

+0

@Cinn Ja, füge das einfach über "exit/b" ein. Wenn Sie dieses Skript durch Doppelklicken starten und die Ergebnisse lesen möchten, fügen Sie eine "Pause" über "exit/b" und erneut als letzte Zeile des Skripts ein. – rojo

+0

Das ist großartig, es ist weit fortgeschrittener als das, was ich gewohnt bin. Was ich hier zu tun versuche, ist es Schleife nach oben, durchlaufen Sie erneut, und wiederholen Sie den Vorgang, bis es eine stabile Verbindung findet. Sobald dies der Fall ist, wird 'goto: Starting' gestartet und ein Server gestartet. Wiederholen Sie den gesamten Ping-Vorgang erneut 24/7, wenn dies erforderlich ist. (deshalb ist es wichtig, dass es 100% Verbindung VOR dem Starten des Servers ist). https://i.gyazo.com/5031f1f297033350a8fac99f0ba60fa2.png – Cinn

Verwandte Themen