Batch (ODER PASCAL) (aber lieber Batch ;) )script Ping auslesen und nachricht geben wenn ping über 30?


14.11.2020, 19:17

Habe auch Pascal auf der umgebung Delphi als backup falls sowas wirklich garnicht in batch geht

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

"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.

krustentierr 
Fragesteller
 14.11.2020, 19:21

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?

0
krustentierr 
Fragesteller
 14.11.2020, 19:22

und hättest du nen programmiervorschlag für mich, stehe am anfang von allem sozusagen

0
franzhartwig  14.11.2020, 19:27
@krustentierr

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.

0
krustentierr 
Fragesteller
 14.11.2020, 19:29
@franzhartwig

alles klaro dann such ich mir maln paar schnipsel raus und puzzle die zusammen

0
krustentierr 
Fragesteller
 14.11.2020, 19:26

also ich wüsste auch nicht wie ich das auslesen soll, brauche da echt Hilfe 😢

0
krustentierr 
Fragesteller
 14.11.2020, 22:32

@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

0
franzhartwig  14.11.2020, 22:55
@krustentierr

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.

0
Erzesel  15.11.2020, 17:29
@krustentierr

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.)

0
franzhartwig  15.11.2020, 17:39
@Erzesel
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.

1