1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

AppleScript und Shell Script "Ping"

Dieses Thema im Forum "AppleScript" wurde erstellt von Mini-Leopard, 23.06.08.

  1. Mini-Leopard

    Mini-Leopard Rhode Island Greening

    Dabei seit:
    20.03.08
    Beiträge:
    476
    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
     
  2. crashtron

    crashtron Idared

    Dabei seit:
    15.01.06
    Beiträge:
    27
    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?
     
  3. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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
     
  4. Mini-Leopard

    Mini-Leopard Rhode Island Greening

    Dabei seit:
    20.03.08
    Beiträge:
    476
    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" :D

    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
     
  5. Skeeve

    Skeeve Pomme d'or

    Dabei seit:
    26.10.05
    Beiträge:
    3.121
    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
     
  6. Mini-Leopard

    Mini-Leopard Rhode Island Greening

    Dabei seit:
    20.03.08
    Beiträge:
    476
    Soooo...!
    Alles funktioniert bestens!

    Nein - Handler habe Ich noch nicht oft benutzt.
    Dankeschön für die Hilfe!

    Nichts anderes hatte Ich gesucht!
     

Diese Seite empfehlen