Ein Autoit-Bug?

  • Hallo, ich bin gerade dabei ein Skript zu schreiben, leider funktioniert eine Methode nicht so richtig wie ich möchte

    wenn ich die integrierte Funktion

    [autoit]

    ping

    [/autoit]

    verwende, bekomme ich immer 1 zurück, der

    [autoit]

    @error

    [/autoit]

    gibt immer 0 zurück.
    egal, ob netzwerkadapter deaktiviert oder kabel abgezogen
    nur bei einer ungültigen IP-Adresse (bsp.: 983.1.1.1) gibt es fehler

    was kann ich tun?

    Einmal editiert, zuletzt von loady (1. Februar 2013 um 10:59)

  • [autoit]

    ping($ziel_ip, 100)
    MsgBox(0,"",@error)

    [/autoit]

    gibt immer 0 zurück
    ping gibt immer 1 zurück
    selbst, wenn mein einziger adapter deaktiviert ist oder das netzwerkkabel abgesteckt

    in $ziel steht "192.168.2.1"

    der windows ping verhält sich so, wie es anzunehmen ist

  • 0.. steht doch da ;)

    Zeigst du uns mal ein Skript? Was pingst du an?

    ich möchte eine textdatei erstellen, die mir sagt, wann das netz weg war und wann die verbindung wieder besteht

    ich bin gerade am umwerfen des skritpcodes aufgrund des fehlers, deswegen muss noch nicht alles sinn ergeben
    ich wollte jetzt einfach nur dass ping das richtige zurückgibt

    Spoiler anzeigen
    [autoit]

    Local $ziel_ip = "192.168.2.1"
    Local $antwort = 0
    Local $letzte_antwort = 0

    [/autoit] [autoit][/autoit] [autoit]

    _log("Pinger gestartet")

    [/autoit] [autoit][/autoit] [autoit]

    While True

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(100)

    $error = _ping($ziel_ip)

    [/autoit] [autoit][/autoit] [autoit]

    If $error == 0 AND $letzte_antwort == 0 Then
    $letzte_antwort = 1
    _log($ziel_ip & " erreichbar.")
    ElseIf $error <> 0 AND $letzte_antwort == 1 Then
    $letzte_antwort = 0
    _log($ziel_ip & " nicht erreichbar!")
    EndIf

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ping($ziel_ip = "192.168.2.1")
    $ping = ping($ziel_ip, 100)
    MsgBox(0,"",@error)
    return ($ping)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _log($text = "")
    FileWrite("C:\pinglog.txt", "[" & @MDAY & "." & @MON & "." & @YEAR & " - " & @HOUR & ":" & @MIN & ":" & @SEC & "] " & $text & @CRLF)
    EndFunc

    [/autoit]
  • Hi, versuchs mal so:

    Spoiler anzeigen
    [autoit]

    Local $ziel_ip = "192.168.2.1"
    Local $antwort = 0
    Local $letzte_antwort = 0

    [/autoit] [autoit][/autoit] [autoit]

    _log("Pinger gestartet")

    [/autoit] [autoit][/autoit] [autoit]

    While True

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(100)

    [/autoit] [autoit][/autoit] [autoit]

    $error = _ping($ziel_ip)

    [/autoit] [autoit][/autoit] [autoit]

    If $error > 0 AND $letzte_antwort == 0 Then
    $letzte_antwort = 1
    _log($ziel_ip & " erreichbar.")
    ElseIf $error < 1 AND $letzte_antwort == 1 Then
    $letzte_antwort = 0
    _log($ziel_ip & " nicht erreichbar!")
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ping($ziel_ip = "192.168.2.1")
    return ping($ziel_ip, 100)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _log($text = "")
    FileWrite("C:\pinglog.txt", "[" & @MDAY & "." & @MON & "." & @YEAR & " - " & @HOUR & ":" & @MIN & ":" & @SEC & "] " & $text & @CRLF)
    EndFunc

    [/autoit]
  • ursprünglich hatte ich den code so, dass im return direkt der ping-aufruf gestartet wird
    nur zur fehlersuche habe ich schnell ne variable und ne messagebox reingebastelt

    sollte ja aber auch eigentlich kein unterschied machen, typen und casten gibts ja nicht
    was ich nicht verstehe ist diese 1 die zurückkommt
    diese ist ja als eine millisekunde zu interpretieren, kann aber ja gar nicht sein wenn gar keine verbindung besteht

    • Offizieller Beitrag

    Das Problem hatten wir schon einmal (kann den Thread selbst mit Google aber gerade nicht finden). Ich meine mich zu erinnern, dass das Ergebnis war, dass die AutoIt-Ping-Funktion tatsächlich unter manchen Umständen nicht korrekt funktioniert. Als Alternative kannst du die korrekte Ausgabe des cmd-Programmes anzapfen :).

  • Hi, vielleicht ist es bereits zu spät bzw mittlerweile unnötig, aber ich hatte mir vor längerer Zeit auch mal genau soetwas geschrieben.

    @loady: Kannst es für dich nutzen/modifizieren wenn du willst.

    Offlinelogger by Lottich
    [autoit]

    #include "Date.au3"
    #include "File.au3"

    [/autoit] [autoit][/autoit] [autoit]

    Global $ping_1 = "www.google.de"
    Global $ping_2 = "www.ifa-clan.de"
    Global $ping_3 = "www.autoit.de"
    Global $ping_4 = "www.web.de"
    Global $ping_5 = "www.gmx.de"
    Global $basis = @ScriptDir & "\Offlinelogs\"
    Global $pfad = @ScriptDir & "\Offlinelogs\" & _NowDate() & ".log"
    Global $pfad2 = @ScriptDir & "\Offlinelogs\_Auswertung.log"
    Global $Hour, $Mins, $Secs, $liste, $ist, $ist1, $ist2

    [/autoit] [autoit][/autoit] [autoit]

    Func starte_protokoll()
    If Not Ping($ping_1,500) Then ; Wenn das anpingen dieser Webseiten nicht werfolgreich ist,
    If Not Ping($ping_2,500) Then ; wird der Timer initialisiert, denn es ist höchst wahrscheinlich,
    If Not Ping($ping_3,500) Then ; dass die Internetverbindung aus irgend einem Grund nicht vorhanden ist.
    If Not Ping($ping_4,500) Then
    If Not Ping($ping_5,500) Then
    $pfad = @ScriptDir & "\Offlinelogs\" & _NowDate() & ".log"
    $timer = TimerInit()
    $startzeit = _NowTime(5) ; Zeitpunkt der Initialisierung des Timers für den korrekten Logeintrag speichern.
    If Not FileExists($pfad) Then
    $neu = FileOpen($pfad,1) ; Hier wird das Grundgerüst des Logfiles erstellt, falls nicht vorhanden.
    FileWrite($neu,"[registrierte Ausfälle]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" & @TAB & "0" &@CRLF& "Zeit Total" &@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF& _
    "[gesammelte Ticks]" &@CRLF& "Anzahl" &@TAB&@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF& "[detailierte Liste]")
    FileClose($neu)
    EndIf
    If Not FileExists($pfad2) Then
    $neu = FileOpen($pfad2,1) ; Hier wird das Grundgerüst der Zusammenfassung aller betroffenen Tage erstellt, falls nicht vorhanden.
    FileWrite($neu,"[Zusammenfassung]" &@CRLF& "Anzahl betroffener Tage" &@TAB& "=" &@TAB& "0" &@CRLF& "Anzahl der Ausfälle" &@TAB&@TAB& "=" &@TAB& "0" & _
    @CRLF& "Zeit Total" &@TAB&@TAB&@TAB&@TAB& "=" &@TAB& "0" &@CRLF&@CRLF&"gesammelte Ticks" &@TAB&@TAB& "=" &@TAB& "0")
    FileClose($neu)
    EndIf
    Do ; Die schleife, die so lange abgearbeitet wird, bis eine der Webseiten wieder erreichbar ist,
    Sleep(250) ; was eine vorhandene Internetverbindung bestätigt.
    Until Ping($ping_1,500) Or Ping($ping_2,500) Or Ping($ping_3,500) Or Ping($ping_4,500) Or Ping($ping_5,500)

    [/autoit] [autoit][/autoit] [autoit]

    $ticks = TimerDiff($timer) ; Beendet den Timer und liest die angesammelten Ticks für die Weiterverwendung aus.
    $ist = IniRead($pfad,"gesammelte Ticks","Anzahl","0") ; Liest die bisher gesammelten Ticks des aktuellen Tages aus und addiert diese
    IniWrite($pfad,"gesammelte Ticks","Anzahl",@TAB & $ticks + $ist) ; mit den neu gesammelten Ticks. Dient der Auflistung der gesammten Ausfallzeit.

    [/autoit] [autoit][/autoit] [autoit]

    _TicksToTime($ticks, $Hour, $Mins, $Secs) ; Konvertiert die aktuellen Ticks in ein vernünftiges Zeitformat und schreibt den Log-Eintrag in den aktuellen Tages-Log.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden keine Verbindung zum Internet" & @TAB & "|- Ticks =" & @TAB & $ticks)
    IniWrite($pfad,"detailierte Liste","ab " & $startzeit & @TAB & @TAB, $dauer)

    [/autoit] [autoit][/autoit] [autoit]

    $ist = IniReadSection($pfad,"detailierte Liste") ; Aktualisiert die Anzahl der
    IniWrite($pfad,"registrierte Ausfälle","Anzahl",@TAB & ($ist[0][0])) ; Ausfälle des aktuellen Tages.

    [/autoit] [autoit][/autoit] [autoit]

    $ist = IniRead($pfad,"gesammelte Ticks","Anzahl","0") ; Liest die gesammten Ticks des aktuellen Tages aus und konvertiert diese zur Niederschrift
    _TicksToTime($ist, $Hour, $Mins, $Secs) ; in ein vernünftiges Zeitformat um die gesammte Ausfallzeit des aktuellen Tages zu bekommen.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden")
    IniWrite($pfad,"registrierte Ausfälle","Zeit Total", $dauer)

    [/autoit] [autoit][/autoit] [autoit]

    $liste = _FileListToArray($basis,"*.*.*.log",1)
    Local $result1 = 0, $result2 = 0
    For $i = 1 to $liste[0]
    $ist1 = IniRead($basis & $liste[$i],"gesammelte Ticks","Anzahl","0") ; Liest alle Ticks der geloggten Tage aus.
    $ist2 = IniRead($basis & $liste[$i],"registrierte Ausfälle","Anzahl","0") ; Liest alle Ausfälle der geloggten Tage aus.
    $result1 = $result1 + $ist1
    $result2 = $result2 + $ist2
    Next
    IniWrite($pfad2,"Zusammenfassung","Anzahl betroffener Tage",@TAB & $liste[0]) ; Aktualisiert die Anzahl pro geloggtem Tag.
    IniWrite($pfad2,"Zusammenfassung","gesammelte Ticks",@TAB & $result1) ; Aktualisiert die Anzahl der Ticks pro geloggtem Tag.
    IniWrite($pfad2,"Zusammenfassung","Anzahl der Ausfälle",@TAB & $result2) ; Aktualisiert die Anzahl der Ausfälle pro geloggtem Tag.

    [/autoit] [autoit][/autoit] [autoit]

    $ist = IniRead($pfad2,"Zusammenfassung","gesammelte Ticks","0") ; Konvertiert die Ticks aller geloggten Ausfälle in ein
    _TicksToTime($ist, $Hour, $Mins, $Secs) ; lesbares Zeitformat zur Niederschrift in der Zusammenfassung.
    $dauer = (@TAB & $Hour & " Stunden, " & $Mins & " Minuten und " & $Secs & " Sekunden")
    IniWrite($pfad2,"Zusammenfassung","Zeit Total", $dauer)
    EndIf
    EndIf
    EndIf
    EndIf
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    starte_protokoll()
    Sleep(2000)
    WEnd

    [/autoit]


    Damit wird nur dann ein Logfile erstellt, wenn keine der 5 IP-Adressen/Websites nicht erreicht werden können. Dann kann man ja davon ausgehen, dass keine Verbindung zum Internet besteht.
    Das Logfile ist übersichtlich und trägt im Namen das Datum als das Internet nicht zur Verfügung stand. Desweiteren wird auch eine Zusammenfassung erstellt, inder die gesammte Ausfallzeit protokolliert wird.

    Grüsse, Lottich

  • hi, danke
    ich denke dann trifft das bei mir zu was peethebee gesagt hat, anders kann ichs mir nicht erklären

    danke lottich, aber das problem bei mir scheinbar ist, dass die ping funktion nicht zuverlässig funktioniert

  • Es ist aber nicht so, das schlicht deine Firewall den Ping blockiert?

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • nein, ich habe auf meinem pc keine aktive firewall

    ich hab die variante mit der temporären textdatei versucht, das kostet zu viel last, sekündlich eine datei zu schreiben, lesen und wegzulöschen =/
    kann ich das ergebnis nicht direkt verwerten?

  • Kannst du schon machen:

    Spoiler anzeigen
    [autoit]

    $ip = "127.0.0.1"

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"",_ping($ip))

    [/autoit] [autoit][/autoit] [autoit]

    Func _ping($f_ip= "127.0.0.1")
    Local $f_out_read
    Local $f_err_read
    $pid = Run(@ComSpec & " /c " & 'ping '&$f_ip, "", @SW_HIDE,6)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $f_out_read &= StdOutRead($pid)
    If @error = 2 then ExitLoop
    sleep(100)
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $f_err_read &= StderrRead($pid)
    If @error = 2 then ExitLoop
    sleep(100)
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    Return "Output " &$f_out_read &@CRLF&"Error "&@CRLF& $f_err_read
    StdioClose($pid)
    EndFunc

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • nein, ich habe auf meinem pc keine aktive firewall


    Ich kann sowas nicht verstehen. Dass es immer wieder leute gibt, die ohne Feuerwand ins WWW gehen. 8|
    Persönlich kann ich das eigentlich gar nicht glauben, da Windows ja von hause aus eine Firewall nutzt. Deshalb bin ich mir fast schon sicher,
    dass es sich hier um verarsche oder absichtlicher Lüge handelt.

  • danke chip, hat mir weitergeholfen

    Lottich
    die windows firewall hab ich deaktiviert, die nervt im lan nur
    was soll auch groß passieren? ich mach auf mein pc kein port-forwarding, rausgehend nur nat + spi übern router