Hallo liebe Developer-Freunde! Ich stehe vor einem riesigen Fragezeichen: Ich schreibe an einem Skript, dass ein (oder mehrere) Ping sendet. Das sieht dann aus wie folgt: Code: do shell script "Ping -c 10 www.beispiel-domain.de Das klappt so auch schon einwandfrei und wunderbar. Jetzt möchte Ich gerne die Zeiten verwerten. Sprich, ich möchte den Output, den mir das Shell Script bringt: 64 bytes from 209.85.135.104: icmp_seq=1 ttl=243 time=72.126 ms 64 bytes from 209.85.135.104: icmp_seq=2 ttl=243 time=72.340 ms auswerten. Ich möchte die Zeiten der jeweiligen Pings rausfiltern um dann Weitere Berechnungen anzustellen. Ich habe folgendes versucht: Code: set Skript to do shell skript "Ping -c 10 www.beispiel-domain.de set AnsSkript to value/text/time returned of Skript Habe alle Varianten durchprobiert. Es kommt immer eine Meldung "3 packets transmitted, 2 packets received, 33% packet loss round-trip min/avg/max/stddev = 71.425/72.465/73.506/1.041 ms"“ kann nicht gelesen werden." Hat jemand eine Idee? Hab Ich etwas falsch gemacht? Oder gibt es noch ganz andere Möglichkeiten?? Liebe Grüße und Vielen Dank Mini-Leo
Also wenn ich im Script Debugger folgendes mache: Code: set Skript to do shell script "Ping -c 10 www.beispiel-domain.de" dann ist in der Varible Skript folgendes gespeichert: Code: PING www.beispiel-domain.de (212.227.147.70): 56 data bytes 64 bytes from 212.227.147.70: icmp_seq=0 ttl=56 time=6083.883 ms 64 bytes from 212.227.147.70: icmp_seq=1 ttl=56 time=25.752 ms 64 bytes from 212.227.147.70: icmp_seq=2 ttl=56 time=27.006 ms 64 bytes from 212.227.147.70: icmp_seq=3 ttl=56 time=25.833 ms 64 bytes from 212.227.147.70: icmp_seq=4 ttl=56 time=27.001 ms 64 bytes from 212.227.147.70: icmp_seq=5 ttl=56 time=25.639 ms 64 bytes from 212.227.147.70: icmp_seq=6 ttl=56 time=26.474 ms 64 bytes from 212.227.147.70: icmp_seq=7 ttl=56 time=25.770 ms 64 bytes from 212.227.147.70: icmp_seq=8 ttl=56 time=26.690 ms 64 bytes from 212.227.147.70: icmp_seq=9 ttl=56 time=26.158 ms --- www.beispiel-domain.de ping statistics --- 10 packets transmitted, 10 packets received, 0% packet loss round-trip min/avg/max/stddev = 25.639/632.021/6083.883/1817.288 ms Also eigentlich alles was du willst. Was ist denn bei dir genau anders?
Bitteschön; Code: return ping(10, "www.beispiel-domain.de") on ping(num, hostname) set {pingtimes, min, avg, max, stddev} to paragraphs of (do shell script "ping -c " & num & " " & quoted form of hostname & " | perl -ne " & quoted form of " tr/./,/; if (/=(\\d+,\\d+)\\s*ms/) { print qq($1 ); } elsif (m#(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)\\s*ms#) { print qq(\\n$1\\n$2\\n$3\\n$4\\n) }") set pingtimes to words of pingtimes repeat with i from (count of pingtimes) to 1 by -1 set item i of pingtimes to item i of pingtimes as number end repeat return {pingtimes:pingtimes, min:min as number, avg:avg as number, max:max as number, stddev:stddev as number} end ping
Vielen Dank für die schnelle Hilfe! Ja, Crashtron. Hätte Ich einfach mal nachgedacht, ohne gleich zu posten...! Ich sage immer "Nachgedacht ist halb gewonnen" Das einzige, das mir an dieses Variante nicht gefällt ist, dass Ich nicht die Zahlen einzeln ausgeben kann. Da hat mir das von Skeeve besser gefallen. Hier nochmal ein Dankeschön! Und gleich die nächste Frage dazu: Ich bekomme die Werte nicht in eine Variable geschrieben, die Ich hinterher noch auslesen kann. Denn bei end ping werden alle Variablen gelöscht, die in diesem "On" drin stehen. Habs mal versucht, folgender maßen aus zu schleusen: Code: return ping(4, "www.beispiel-domain.de") on ping(num, hostname) set {pingtimes, min, avg, max, stddev} to paragraphs of (do shell script "ping -c " & num & " " & quoted form of hostname & " | perl -ne " & quoted form of " tr/./,/; if (/=(\\d+,\\d+)\\s*ms/) { print qq($1 ); } elsif (m#(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)\\s*ms#) { print qq(\\n$1\\n$2\\n$3\\n$4\\n) }") set pingtimes to words of pingtimes repeat with i from (count of pingtimes) to 1 by -1 set item i of pingtimes to item i of pingtimes as number end repeat return {pingtimes:pingtimes, min:min as number, avg:avg as number, max:max as number, stddev:stddev as number} end ping set Auto to avg of ping display dialog Auto Aber darauf wird garnicht erst reagiert. Also, in der Hoffnung auf die Lösung meines Problems & Danke Mini-Leo
Du hast noch nie einen Handler verwendet, oder? Code: set ergebnis to ping(4,"www.beispiel-domain.de") Mit Code: avg of ergebnis bekommst Du z.B. den Mittelwertt. Also zusammen so: Code: on run set ergebnis to ping(4, "www.beispiel-domain.de") display dialog avg of ergebnis end run on ping(num, hostname) set {pingtimes, min, avg, max, stddev} to paragraphs of (do shell script "ping -c " & num & " " & quoted form of hostname & " | perl -ne " & quoted form of " tr/./,/; if (/=(\\d+,\\d+)\\s*ms/) { print qq($1 ); } elsif (m#(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)/(\\d+,\\d+)\\s*ms#) { print qq(\\n$1\\n$2\\n$3\\n$4\\n) }") set pingtimes to words of pingtimes repeat with i from (count of pingtimes) to 1 by -1 set item i of pingtimes to item i of pingtimes as number end repeat return {pingtimes:pingtimes, min:min as number, avg:avg as number, max:max as number, stddev:stddev as number} end ping
Soooo...! Alles funktioniert bestens! Nein - Handler habe Ich noch nicht oft benutzt. Dankeschön für die Hilfe! Nichts anderes hatte Ich gesucht!