Batch (ODER PASCAL) (aber lieber Batch ;) )script Ping auslesen und nachricht geben wenn ping über 30?
Hey Leute, ganz kurze Sache,
ich möchte einen ping machen
ping www.google.com -n 20000 z.b. das er 20000 mal google anpingt
google nehme ich einfach als referenz, hat bis jetzt immer gut geklappt, es geht nur drum allgemein zu wissen wann mein inet schlechter wird.
nun kann man das ja in ein batch script packen, jetzt is die Frage wie man das mit ner IF abfrage macht
@echo off
ping www.google.com .n 20000
IF Ping > 30 do
echo Der Ping ist zu hoch
das das nicht geht ist klar aber das ist so die grundaussage, einer ne idee wie man das in batch realisieren könnte?
Habe auch Pascal auf der umgebung Delphi als backup falls sowas wirklich garnicht in batch geht
3 Antworten
Auch wenn Google-Server in der Regel sehr geduldig sind, wenn es darum geht lästige IPs mit Abuse zu belegen, dürften 20000 Pings in Folge wohl eine vorübergehende Blockade auslösen. Also Sorgfalt...
Ein Ping in Ehren kann niemand verwehren:
Pingtest.cmd
@echo off
set "ZielServer=google.com"
rem auslesen der Antwortzeit auf ein Ping (ein Wert wird ers mit ende des Programms übergeben) , darum ist jedes weitere Ping in die Schleife verschwendung!
rem ein Ping der Suchstring Mittelwert filtert die gewünschte Zeile aus der Ausgabe von Ping
for /f "tokens=4 delims==" %%a in ('ping %ZielServer% -n 1 ^|find /i "Mittelwert ="') do (set "MyPing=%%~a")
rem das Zahlenformat ist nicht gerade angetan zu Vergleichen
echo nicht schoen: "%MyPing%"
rem einfach ms entfernen und +0 rechnen schon haben wir eine hübsche saubere Zahl
set /a "MyPing=%MyPing:ms=%+0"
echo eine richtige saubere Zahl: "%MyPing%"
rem MyPing ist durch die Dummyrechnung garantiert eine Zahl größer gleich 0!
rem 0 ist nur möglich, wenn es keine Antwort gab.
if %MyPing% equ 0 (
echo keine Antwort
goto schluss
)
if %MyPing% geq 30 (
echo Der Ping ist mit %MyPing% zu hoch
) else (
echo Dein Ping : %MyPing% Millisekunden
)
:schluss
pause
Wenn du schon eine Adresse häufiger Pingen möchtest, solltest du zufällige Abstände um 1 Minute verwenden. Der Rest ist das gleiche wie Oben nur innerhalb einer Endlosschleife
Bei einem Ergebnis von 0 wird abgebrochen, dann hat das Ziel keine Lust mehr auf Dich...
@echo off
set "ZielServer=google.com"
:loop
echo pinge %ZielServer%
for /f "tokens=4 delims==" %%a in ('ping %ZielServer% -n 1 ^|find /i "Mittelwert ="') do (set "MyPing=%%~a")
set /a "MyPing=%MyPing:ms=%+0"
if %MyPing% equ 0 (
echo keine Antwort
goto schluss
)
if %MyPing% geq 30 (
echo Der Ping ist mit %MyPing% zu hoch
) else (
echo Dein Ping : %MyPing% Millisekunden
)
rem zufällige Pausenzeit 45..90 Sekunden
set /a "randomPauseTime=%random% %% 46 +45"
timeout %randomPauseTime%
rem nächste "Runde"...
goto :loop
:schluss
pause
"Batch" ist ein allgemeiner Term für Stapelverarbeitung. Du meinst das Windows CLI aka die "Eingabeaufforderung".
Der Nachteil bei dieser Methode: Die Antwort des Kommandos "Ping" ist ein mehrzeiliger String.
C:\>ping 8.8.8.8 -n 1
Ping wird ausgeführt für 8.8.8.8 mit 32 Bytes Daten:
Antwort von 8.8.8.8: Bytes=32 Zeit=37ms TTL=117
Ping-Statistik für 8.8.8.8:
Pakete: Gesendet = 1, Empfangen = 1, Verloren = 0
(0% Verlust),
Ca. Zeitangaben in Millisek.:
Minimum = 37ms, Maximum = 37ms, Mittelwert = 37ms
Aus diesem String den benötigten Wert '37' zu extrahieren ist machbar, aber umständlich.
Ab Windows 7 gibt es eine weitere Batch-Sprache: PowerShell. Diese Sprache ist objektorientiert und daher einfacher.
Der Code schaut dann so aus:
while($true){
if((Test-Connection -ComputerName 8.8.8.8 -Count 1).Responsetime -gt 30) {
write-host "Slow Ping"
}
Start-Sleep -Seconds 5
}
Das Skript speicherst Du mit der Endung .ps1 ab und kannst es dann über Powershell starten.
P.S: Der IP Adresse 8.8.8.8 ist der öffentliche DNS Server von Google.
Der Ansatz mit -n 20000 dürfte nicht funktionieren, weil Du ja 20000 Ergebnisse zurückbekommst. Du kannst aber immer nur eine Zahl vergleichen. Also musst Du eine Schleife bauen, die 20000 Mal den Ping absetzt und die Antwort auswertet.
Siehst Du, war nicht so schwer. Pingzeiten sind für mich irrelevant, das interessiert mich nicht. Zudem ist Windows nicht meine Plattform. Deshalb werde ich ein solches Script nicht benötigen.
das Ding mit den tokens= 7 kannst Du Dir abschminken. die meisten DNS stellen auf IPv6 um, damit wird die Ruotine ziemlichunflexibel ein Ping und nach Mittelwert filtern (der Mittelwert aus einem Ping ist das Ping). Die Betreffende Zeile ist bei IPv4 und IPv6 gleich.
Weshalb Du die Suchzeile nich gleich auftrennst sondern in eine Subschleife jagst ist mir ein Rätsel ...
Die Variable Line ist totes Fleisch
...und DelayedExpansion ist völlig unnötig (macht nur Sinn wenn eine im Klammerblock gesetzte Variable im gleich Block verarbeitet werden soll.)
das Ding mit den tokens= 7 kannst Du Dir abschminken. die meisten DNS stellen auf IPv6 um,
Das hat weniger mit den DNS zu tun. DNS stellen nicht auf IPv6 um. Die Zielserver müssen per IPv6 erreichbar sein, dann kann der DNS auch einen AAAA Record zurückliefern. Der Client muss auch nach einem AAAA Record fragen. Es hängt also vom Client und vom angesprochenen Server ab, ob eine IPv4-Adresse (A Record) oder eine IPv6-Adresse (AAAA Record) zurückgeliefert wird, nicht jedoch vom DNS.
Wird ein AAAA-Record (IPv6) zurückgeliefert und das Betriebssystem nutzt ihn, muss man halt tokens=5 verwenden.
Einfacher ist es, nicht www.google.com anzupingen, sondern eine IPv4-Adresse. Sinnvollerweise ist das diejenige von dem Server, auf dem man gerade spielt.
Weshalb Du die Suchzeile nich gleich auftrennst sondern in eine Subschleife jagst ist mir ein Rätsel ...
Das hat er sich nicht selbst übersetzt, sondern irgendwo bei Reddit gefunden und angepasst. Ich glaube auch nicht, dass er das vollständig verstanden hat.
Die Variable Line ist totes Fleisch
Fiel mir auch auf.
also ich wüsste auch nicht wie ich das auslesen soll, brauche da echt Hilfe 😢
und hättest du nen programmiervorschlag für mich, stehe am anfang von allem sozusagen
Nein, ich kann nicht programmieren. Aber mit dem Gedankenansatz und Suchmaschine sollte man da etwas basteln können. Du
- brauchst eine Schleife
- musst aus der Ausgabe des Pings die Latenzzeit ausfiltern
- musst die Zahl mit der von Dir vorgegebenen Maximallatenz von 30 ms vergleichen
Mehr brauchst Du nicht. Das sollte nicht so schwer sein.
alles klaro dann such ich mir maln paar schnipsel raus und puzzle die zusammen
das so verknüpfen das das während der ping abfrage die werte ausliest geht nicht, also man kann das nur auslesen wenns beendet ist?
@echo off
setlocal EnableDelayedExpansion
rem Settings
set warningPing=40
set dangerPing=100
set lastColor=0
set pingNum=0
rem Titel und Aussehen
mode con: cols=75 lines=4
title Latency Check
:Loop
rem Run the ping command and extract out the response time
for /F "delims=" %%a in ('ping www.google.com -n 2 ^| findstr /C:"Antwort von"') do (
set "line=%%a"
for /F "tokens=7 delims== " %%b in ("%%a") do set pingTime=%%b
)
rem Set the color of the CMD window and Text
set /A pingNum=%pingTime:~0,-2%
if !pingNum! LEQ %warningPing% (
set color=2F
goto :colorGotSet
)
if !pingNum! GEQ %warningPing% (
if !pingNum! LEQ %dangerPing% (
set color=E0
goto :colorGotSet
)
)
if !pingNum! GEQ %dangerPing% (
set color=4F
)
:colorGotSet
if !color! neq %lastColor% (
color !color!
set lastColor=!color!
)
rem The Output!
cls
echo/
echo Ping: %pingTime%
goto :Loop
wenns bei dir nicht geht, musst du eventuell bei "tokens" von 7 auf 5 umsteigen, kommt auf deine CMD drauf an beim part "findstr" sucht er nen string in der zeile wo er "Antwort von" findet, und tokens gibt an an welcher stelle der string ist, bei manchen cmds wird dir noch byte ausgegeben dann is es an 7. stelle ansonsten normal 5
das programm macht keine ausgabe sondern ändert die Farbe in gelb wenn der ping bei 40+ ist und wenn der ping bei 100+ ist ändert das programm die farbe in rot, ansonsten grün also ganz einfach