1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BLinz

Beiträge von BLinz

  • FotoSort

    • BLinz
    • 5. Juli 2017 um 17:50

    Ich zerlege gerade das Skript - und lerne fleißig.
    Ich weis was die folgende Zeile macht - die Checkboxen setzen, aber ich habe nicht ganz das "Wie" verstanden:


    AutoIt
    For $i = 1 To $aDecoders[0][0]
        $aIDPicFormat[$i - 1] = GUICtrlCreateCheckbox($aDecoders[$i][5], 600 + Mod($i - 1, 5) * 70, 173 + Int(($i - 1) / 5) * 25, 55, 20)

    Mir geht es nur um die X und Y Koordinaten des GUICtrlCreateCheckbox() Befehls.
    Das Ergebnis ist, das alle Werte aus dem Array in 2 Reihen hintereinander eine Checkbox erhalten

    Fangen wir mit X an:
    600 + Mod($i - 1, 5) * 70

    • Bei 600 Pixeln von links fangen wir an
    • ist die erste Reihe "voll" soll die nächste Reihe 70 Pixel weiter kommen
    • Mod kannte ich bisher nur zur "Gerade/Ungrade" Ermittlung ... naja, es sind ja nur 2 zeilen, also Gerade Zeile 1, Ungerade Zeile 2 nehme ich an (Falsch!)

      • Mod($i - 1, 5) ... Ich weis da kommt bei $i = 1 To 10 die Zahlenfolge 0 1 2 3 4 0 1 2 3 4 raus ... genutzt werden dazu $i = 0 1 2 3 4 5 6 7 8 9 ...
      • Also wird wohl eher erst Zeile 1 und dann Zeile 2 befüllt ... ok
      • und die 5 als 2. Parameter sorgt bestimmt dafür das es alle 5 Werte wieder von vorne losgeht, also werden es 5 Spalten
      • So, auch nach dem 10 Lesen des Eintrages in der Hilfe habe ich den Befehl Mod() nicht verstanden ... auch wenn ich sehe was er macht.
      • Etwas gegoogelt ... immer noch nicht schlauer. Dreisatz kann ich noch, der Rest ist so 25 Jahre her.
    • Was danach passiert ist klar: Das Ergebnis von Mod wird mal dem gewünschten Abstand der Spalten = 70 genommen. Also ergibt sich +0, +70, +140, +210, +280 ... und wieder von vorne

    Nun Y, ist bestimmt einfacher:
    173 + Int(($i - 1) / 5) * 25

    • Bei 173 Pixeln von oben ist die erste Zeile ... * 25 ... und bei 198 Pixel die 2. Zeile
    • ($i - 1) ... ok, wieder die Zahlenfolge 0 1 2 3 4 5 6 7 8 9
    • ($i - 1) / 5) ... und die Zahlenfolge teilen wir immer durch 5 ... also ist die Zahlenfolge nun 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8
    • Int() gibt uns davon nur die ganze Zahl, also den Teil vor dem Komma/Punkt wieder. Zahlenfolge ist also 0 0 0 0 0 1 1 1 1 1
    • Und das dann mal 25. Wir addieren also zum Startwert 4 x 0 (=Nichts) und 4 x 25
    • Ok, Y habe ich verstanden. So ganz und im allen

    Dann bleibt ja nur noch eines übrig:
    Jemand müsste mir mal bitte den Befehl Mod() erklären.
    Aber bitte so wie man es einem 6-Jährigen erklären würde - Danke!


    Schöne Grüße,
    BLinz

  • OutlookEX - Outlook status auslesen

    • BLinz
    • 5. Juli 2017 um 10:29

    Kam gleich in meine Sammlung.
    Hier noch eine Variante die statt des Statuscode (=Zahl) den Statustext zurück gibt.

    AutoIt
    Func _OL_status_as_Text()
    	Local $a_Status2Text[9][2] = [ [800, "olOnline" ], [ 700, "olCachedConnectedFull" ], [ 600, "olCachedConnectedDrizzle" ], [ 500, "olCachedConnectedHeaders" ], [ 400, "olCachedDisconnected" ], [ 300, "olDisconnected" ], [ 200, "olCachedOffline" ], [100, "olOffline"] ]
    	$olApp = ObjGet("", "Outlook.Application")
    	If @error Then
    		$olApp = ObjCreate("", "Outlook.Application")
    	EndIf
    
    
    	If IsObj($olApp) Then
    		$olNameSpace = $olApp.GetNamespace("MAPI")
    		$status = $olNameSpace.ExchangeConnectionMode
    		For $i = 0 To UBound($a_Status2Text, 1) Step 1
    			If $a_Status2Text[$i][0] = $status Then
    				Return $a_Status2Text[$i][1]
    			EndIf
    		Next
    	Else
    		Return -1
    	EndIf
    EndFunc
    
    
    
    
    MsgBox(64, "Outlook Status", "Status: " & _OL_status_as_Text())
    Alles anzeigen
  • OutlookEX - Outlook status auslesen

    • BLinz
    • 5. Juli 2017 um 09:49

    Mhh, geht wohl, ich hab hier was gefunden was nach VB aussieht: https://stackoverflow.com/questions/1825…ectivity-status


    Brainfuck
    Sub CheckExchangeStatus()
    'olCachedConnectedDrizzle    olCachedConnectedFull   olCachedConnectedHeaders    olCachedDisconnected    olCachedOffline olDisconnected  olNoExchange    olOffline   olOnline
    '600                           700                      500                         400                     200             300             0               100         800
    
    
     Dim olApp As New Outlook.Application
     Dim olNameSpace As Outlook.NameSpace
    
    
     Set olNameSpace = olApp.GetNamespace("MAPI")
     Dim ExchangeStatus  As OlExchangeConnectionMode
    
    
     ExchangeStatus = olNameSpace.ExchangeConnectionMode
     MsgBox (ExchangeStatus)
    
    
    End Sub
    Alles anzeigen

    Müsste mal ein "Objekte"-Profi in AutoIt übersetzen ...

  • GIF-Animation mit GDI+

    • BLinz
    • 5. Juli 2017 um 09:45
    Zitat von Oscar

    Die wollte ich auch testen, aber der Download funktioniert dort nicht mehr.

    Solche Probleme kenne ich: Bitte schön!

    Dateien

    GIFAnimation.zip 20,83 kB – 731 Downloads
  • GIF-Animation mit GDI+

    • BLinz
    • 4. Juli 2017 um 23:02

    Ich nutze seit langen dazu die GIFAnimation.au3 , die schluckt sogar die Daten aus @UEZ seinem File to Base64 String Code Generator
    War damals die einzig funktionierende Lösung die ich auch umgesetzt bekommen habe.

  • Nach dem Aufruf einer Schleife wieder zurück in die GUI

    • BLinz
    • 4. Juli 2017 um 18:49
    Zitat von alpines

    6. Wieso deklarierst du alle Variablen am Anfang? Deklariere sie doch erst wenn du sie brauchst.

    Ist bestimmt eine Philosophie-Frage - aber ich habe mir das extra angewöhnt. Da muss ich zwar bei jeden neuen Variablen wieder ganz an den Anfang scrollen (SciTE Jump sei Dank nicht so schlimm), habe dann aber alle Variablen die Global sind auf einem Blick.
    Die Variablen sortiere ich dann noch nach Aufgaben / Themen - bzw. Ich schreibe diese in entsprechenden Blöcken zusammen.

    Dann fällt mir auch das ich gerade die 5. Temp-Variable erstellen will etc.

    Und beim Kompilieren meckert die Funktion auch nicht das die Globale Variable eventuell noch gar nicht angelegt ist.

    Dann lieber der Hinweis den Variablennamen ggf. den gedachten Typ mitzugeben, also ob Text oder Zahl etc: https://www.autoitscript.com/wiki/Best_coding_practices

  • FotoSort

    • BLinz
    • 4. Juli 2017 um 14:05

    Ich war gestern Abend hin und her gerissen ob ich mich selbst daran mache ... aber so ein wenig wiederstrebt es mir wenn dann 90% von einem anderen ist.
    Und sich zu trauen das Skript eines Author zu verbessern, von dem in jedem 2. eigenen Skript mindestens eine Funktion oder mehr steckt :/

  • 2D - Array Problem/Frage

    • BLinz
    • 3. Juli 2017 um 22:19

    Naja,

    du legst das Array mit

    AutoIt
    global $stocks[4][4]

    an. ist also 4x4 groß.

    In deinen Bildern sind das Zeile 0 bis 3, Spalte 0 bis 3 (0, 1, 2 und 3 sind ja 4 Werte, er fängt bei 0 an zu zählen)

    Später machst du

    AutoIt
    _ArrayAdd($stocks, $_symbol_read, $i-1)

    Wenn du mal in SciTE auf _ArrayAdd() gehst und F1 drückst wirst du in der Hilfe sehen das dieser Befehl einen weiteren Wert an ein bestehendes Array anhängt.
    Das wäre also Zeile 4 - und so weiter

    Du müsstest statt _ArrayAdd() einfach die Werte direkt zuweisen, in etwas so:


    AutoIt
    #include <array.au3>
    func _read_DB()
    	global $stocks[4][4]
    For $i = 0 to 3 Step 1
    		$read = filereadline("stocks.txt", $i)
    		$_symbol_read = IniRead("datenbank.ini", "Stocks", $read & "_Symbol", "")
    		$_strike_read = IniRead("datenbank.ini", "Stocks", $read & "_Strike", "")
    		$_praemie_read = IniRead("datenbank.ini", "Stocks", $read & "_Praemie", "")
    		$_strategie_read = IniRead("datenbank.ini", "Stocks", $read & "_Strategie", "")
    		$stocks[$i][0] = $_symbol_read
    		$stocks[$i][1] = $_strike_read
    		$stocks[$i][2] = $_praemie_read
    		$stocks[$i][3] = $_strategie_read
    	Next
    	_ArrayDisplay($stocks)
    EndFunc   ;==>_read_DB
    Alles anzeigen

    Und wenn ich dem nicht zuvor komme wird irgendjemand hier schreiben das es auch die Funktionen

    IniRead gibt welche dir direkt Werte aus einer .ini Datei liest und
    IniReadSection welches die Daten aus einem Ini-Abschnitt direkt in ein Array liest.

  • Autoit3 Internal Process Piping | Pipe

    • BLinz
    • 3. Juli 2017 um 21:57
    Zitat von chesstiger

    Also, wenn eine Firewall Verbindungen zu 127.0.0.1 verbietet, ist sie schon sehr restriktiv konfiguriert.

    Es muss beim öffnen des Ports darauf geachtet werden dies auch nur auf 127.0.0.1 zu tun. 0.0.0.0 oder richtige IP-Adresse - und schon poppt der Warndialog hoch.
    127.0.0.1 sollte in der Tat noch funktionieren

  • Windows Storage Space ?

    • BLinz
    • 3. Juli 2017 um 19:48
    Zitat von alpines

    Wird von dem zu sichernden Datenträger eine Dateiliste angelegt und abgeglichen so ähnlich wie in Git oder wird das ganze nochmal gesichert? Letzteres müsste ja unfassbar viel Speicher fressen. Hast du die Möglichkeit auf ein genaues Datum zurückzusetzen, oder hast du nur sozusagen die neueste Revision?

    Wenn du mit "Veeam Endpoint Backup" sicherst kannst du angeben wie viele Wiederherstellungspunkte du haben willst, z.B. 14 für 14 Tage. Der macht ein Fullbackup und danach nur noch inkrementell. Also eine Dicke Datei und 13 kleinere mit den Änderungen. Wird gesichert wird im Anschluß die älteste kleine Datei in die Große eingepflegt. Du kannst sowohl Imagebasiert ("Festplatte D:") als auch Dateibasiert ("Ordner D:\Install") sicher - nur nicht beides gleichzeitig.
    Und halt alle Dateien aus den letzten 14 Tagen.

    Machst du es mit anderer Software, z.B. wie ich mit Seafile so hast du immer den letzten Stand. Es gibt pro gesyncten Ordner einen Papierkorb, die Aufbewahrungszeit kannst du einstellen (pro Ordner). Der papierkorb hilft also gegen "gelöscht". geht man auf eine Datei über das Webinterface so kann man dort auch noch mal die letzten 19 Versionen sehen (kann man auch irgendwo einstellen wie viele) und wiederherstellen lassen.
    Hängt von der Software ab.
    bei Seafile ist das so ähnlich wie git bzw. Dropbox. Jede Datei wird in Blöcke aufgeteilt. Pro Block wird eine Prüfsumme gebildet (=eindeutige Nummer). Diese wird an den Server gesendet. Der schaut in seiner SQL-Datenbank nach ob es die Nummer schon gibt. Wenn nein lässt es sich den Block vom Cient senden. Wenn es die Nummer schon gibt notiert er sich für die Datei das diese auch an Stelle X für Datei Y benötigt wird.

    Ich habe gerade mal geschaut, auf meinem Seafile-Server in Frankreich (Mietserver bei SoYouStart, bei denen ist Strom schön billig) liegen lokal ca. 260GB Daten. Die MySQL Datenbank dazu hat zur Zeit 39Mbyte
    Was ich an Seafile mag: Und wenn er 3 tage braucht um z.B. eine 20GB Datei hochzuladen - irgendwann schafft er es. Auch wenn er neu Anfangen muss - dann überspringt er die Blöcke die er schon hat halt entsprechend schnell.

    Beide Produkte sind nur Stellvertretend - da gibt noch viele andere. Ich bin halt aus beruflichen Gründen (Veeam) und nach vielen Umwegen (BitTorrentSync, Syncthing, OwnCloud) bei diesen Produkten gelandet.

    BLinz

  • Windows Storage Space ?

    • BLinz
    • 3. Juli 2017 um 15:56
    Zitat von Mars

    Die Sektorenfehler kann man durch komplettes formatieren und ggf ein paar mal vollschreiben und wieder leermachen beheben oder?

    Also wenn du Daten auf einem Gerät speicherst, egal ob USB-Stick, HDD oder SSD, das Sektorenfehler meldet ... dann brauchst du die Daten nicht mehr. So eine Platte baue ich aus und gebe diese meinem Sohn zum zerlegen.
    Ich bin Beruflich auch in der IT-Unterwegs ... und habe schon zu oft Daten wieder retten müssen die nicht gesichert wurden weil diese ja "unwichtig" waren.

    Zum zusammenführen von vielen USB-Sticks mit "Windows Storage Space": Naja, da werden dir schnell die USB-Ports ausgehen. Und über Hubs etc. wird das ganze nicht schneller - und schon gar nicht sicherer (wieder viel mehr Fehlerquellen). Wegen eines Ausfalls solltest du peinlich genau dokumentieren welcher Sticker welcher in der Datenträgerverwaltung ist. Nicht das du beim Austausch eines defekten den falschen ziehst.

    Zudem bin ich nicht sicher ob Windows das überhaupt zulassen wird. Es gibt Sticks die wie eine Festplatte behandelt werden, andere als austauschbare Datenträger. Keine Ahnung ob er dich lässt.

    Der Punkt ist: Willst du nur spielen/ probieren? Dann mach es. Willst du das tatsächlich als Ablage für wichtige Daten nutzen? Lieber nicht.

    Wenn das Ding 1 Jahr läuft - und das ist was damit .... weist du dann noch wie alles lief?

    Ich betreibe verschiedene Szenarien, alle auf Hinblick mit Datensicherheit, für dich wäre zum Beispiel ja vielleicht so etwas interessant:

    • "Server" mit Windows (startet bei mir von kleiner SSD) mit 4TB Platte für die Daten
    • Tägliches, automatisiertes Backup auf einen Raspberry Pi / Banana Pi mit 2x 2,5" Festplatten

    Das Backup mache zum einem mit einem Image-Tool (für das Betriebssystem, Veeam Endpoint Backup, sichert auf Cifs-Freigabe)
    Zum anderen mit Seafile. Ist ähnlich wie Dropbox, sichert mit Depulizierung und Blockbasiert. Auf dem Raspberry der Serverteil.
    Der Client auf dem "Server" kann beliebige Verzeichnisse überwachen. Dank Freischaltung eines Ports von außen kann ich trotzdem von überall an die Daten (mit Handy-App, WIndows oder Linux Client oder Webbrowser).

    Noch besser; Du nimmst 2 Raspberrys + USB-Festplatte, und richtest auf beiden Seafile oder eine alternative Software ein.

    • Den einen stellst du zum Kumpel / Eltern / Onkel. Darf gerne weiter weg wohnen.
    • Den anderen stellst du bei dir auf.
    • Du Installierst bei dir den Client und sicherst auf den entfernten Raspberry
    • Dein Kumpel macht es umgekehrt.

    So hast du ein Backup außer Haus - und dein Kumpel auch. Der entsprechenden Software ist es egal wie lang der erste Sync dauert (oder du machst es lokal und bringst das Ding dann weg)
    Die Daten kannst du verschlüsseln (durch die Clientsoftware), so kommt der Kumpel nicht an deine Daten und du nicht an seine.

    Privat habe ich das noch weiter gesponnen und meine Daten mehrfach redundant auf 2 Seafileserver zu Hause und in Frankreich und in Dropbox (10 Euro/1TB Monatlich) gesichert.
    Zusätzlich liegen die Daten auf einem Rechner und einem Notebook und werden auf einen Testserver in meiner Firma gesichert. Von allem habe ich immer mindestens 2 Kopien, davon eine außer Haus

    Wie @alpines schon vorschlug, lieber Festplatten. Ob du nun 2 kleine nimmst und ein Raid in einem Rechner/Server machst - oder die Daten automatisiert(!!!!!!) sicherst ist dann Geschmackssache.

    Ich hatte vor 2 Jahren eine nagelneue 4TB Festplatte die nach 4 Wochen den Geist aufgegeben hatte. Natürlich just als ich die Originaldaten alle dorthin kopiert und die alten Platten gelöscht hatte.
    Ich musste mir die Daten zwar aus 4 Stellen wiederholen - aber ich hatte diese immerhin noch.

    Wie geschrieben: wenn du nur spielen willst - würde gerne wissen ob das mit den vielen USB-Sticks klappt :)

    Gruß,
    BLinz

  • Autoit3 Internal Process Piping | Pipe

    • BLinz
    • 3. Juli 2017 um 13:51

    Wenn ich es richtig verstehe geht es um die Kommunikation zwischen deinen Programmteilen?

    Ich nutze dazu die Exchange Variables UDF Beta

    Mit der übergebe ich mir Arrays zwischen den Programmen. Der letzte Wert im Array ist nicht immer wie er sein sollte, deshalb hänge ich immer "Dummy" Eintrag dran.
    Das mit dem DLLStructs ... da müsste ich mir erst noch das Wissen aneignen

  • ScreenCaptures werden als schwarzes Bild abgespeichert?

    • BLinz
    • 3. Juli 2017 um 12:52

    Das hatte ich neulich bei auch schon mal bei einem Beispielskript.

    Schon mal ein anderes Bildformat getestet - z.B. BMP - um zu sehen ob es daran liegt? Kannst ja eine Zeile hinzufügen und das Bild in 2 Formaten speichern.
    Falls du Energiespar oder Mausaktivitäten vermutest: Kannst ja vorher einen MouseMove machen.

    Das kannst läuft nicht zufällig in einer RDP-Sitzung?

  • FotoSort

    • BLinz
    • 3. Juli 2017 um 12:40

    Öhm, wenn du noch Langeweile hast: Wenn Gifs angezeigt werden könnten bei diesen auch die Animationen angezeigt werden (ja, es soll auch Gifs ohne Animationen geben - habe ich aber nicht)

    Und zum "Überschreiben oder Namen ändern": Vielleicht eine Option wie "Wenn Ziel und Quelle gleich sind, überspringen". Gleich im Sinne von beide Dateien gleicher Inhalt.

    Ein "Fehler" wäre da noch beim Zähler (1) anhängen:
    [Blockierte Grafik: https://znil.net/images/e/e8/ClipCapIt-170703-123232.PNG]
    War zufällig meine Testdatei ... die Klammern sollen ja bestimmt an das Ende.

    Das Tool hat seit eben (als ich es gesehen hatte) gleich einen festen Platz bei mir bekommen ... Ich habe das sonst immer mit dem Bildbetrachter und 6 offenen Datei-Explorer-Fenstern gemacht,
    deine Idee gefällt mir besser und ist schneller.

  • Programm mit vielen AdlibRegister() aufrufen / Performance / NICHT Multithreading/Parallelprozessing

    • BLinz
    • 3. Juli 2017 um 09:41
    Zitat von xSunLighTx3

    PS: 6800 Zeilen sind schon krass für AutoIt.

    Naja, 25% sind Kommentare - denn die sind wichtig!


    Danke erst einmal an euch alle , ich habe nun einige Ideen wie ich das ganze noch mal im Nachgang optimiere.
    Ich war ganz stolz alles in Funktionen und AdLigRegister() gepackt zu haben.
    Aber wie das nun mal so ist: 20% des Codes sind ist die eigentliche Funktion. und die restlichen 80% sind für eventuelle Probleme, Fehlerbeseitigungen, Prüfungen gegen Fehlbedienungen bzw. Konfigurationsfehler.
    Da wurde die ein oder andere Funktion eventuell zu träge.

    Das Programm macht - zur Zeit zuverlässig - was es soll. Aber ich werden es noch mal die Hauptschleife / Kernroutine optimieren und unnötigen Ballast zu entfernen.
    Da kann ich sicher einige doppelte Abfragen vermeiden bzw. andere vom Tempo her optimieren. Ich habe zum Beispiel die Unsitte mir die Konfiguration immer aus der Setup-GUI auszulesen (ob zum Beispiel ein CheckBox gesetzt ist oder nicht). Das funktioniert zwar, ich unterstelle mal das eine Variable abzufragen schneller ist als jedesmal GUICtrlRead zu machen.

    Und ich habe neulich mal wieder viel in der Hilfe gestöbert und einige "Aha, da gibt es ja was fertiges" oder "Mhh, damit wäre das ja viel einfacher" Momente gehabt.

    Die Methode von @Mars klingt auch sehr gut, da muss ich mir aber erst einen genauen Ablaufplan machen.

    Alles in allem klingt es danach das meine zukünftigen Programme wieder ein wenig besser als die alten werden.

  • Programm mit vielen AdlibRegister() aufrufen / Performance / NICHT Multithreading/Parallelprozessing

    • BLinz
    • 29. Juni 2017 um 14:40
    Zitat von Oscar

    Äh, da muss bei Dir etwas falsch laufen, denn das obige Script funktioniert bei mir einwandfrei.

    Mhh, auf den Windows 7 64bit Clients hier in der Firma ist das Problem genau wie beschrieben.
    Auf meinem Windows 10 Notebook gibt es genau einen Durchlauf (Tooltip mit "0") und dann bis zum schließen der GUI nichts weiter. Danach läuft die Schleife weiter

    AutoIt Version ist 3.3.14.2


    Zitat von Oscar

    Wenn Du zeitkritische Funktionen hast, dann ab damit in die Hauptschleife (beim OnEventMode). Dort können sie so lange brauchen, wie sie wollen.

    Das habe ich jetzt mal genau so gemacht (Die Idee war schon wieder zu einfach für mich), ist gerade im Testlauf.

  • Programm mit vielen AdlibRegister() aufrufen / Performance / NICHT Multithreading/Parallelprozessing

    • BLinz
    • 29. Juni 2017 um 13:35
    Zitat von Oscar

    Die AdlibRegister-Funktion muss schneller durchlaufen werden, als deren Aufruf, ansonsten hängt sich AutoIt irgendwann auf.
    Wenn Du zeitkritische Funktionen hast, dann ab damit in die Hauptschleife (beim OnEventMode). Dort können sie so lange brauchen, wie sie wollen.
    Etwas MultiThreading bekommst Du mit "_Timer_SetTimer". Die werden auch bei einem Sleep oder einer MsgBox oder sonstigen blockierenden GUI-Kram aufgerufen (Fenster bewegen).
    Hier mal ein kleines Testscript:

    Danke für das Beispiel, den Befehl _Timer_SetTimer() habe ich bisher übersehen.

    Dein Beispiel hat aber einen "Fehler". Der Tooltip in der Hauptschleife fängt erst an zu laufen nachdem die GUI geschlossen wurde, sprich die Hauptschleife wird ignoriert und das Exit aus der Funktion greift nicht.
    So auf Anhieb habe ich nicht verstanden warum dem so ist - aber ich forsche noch.

  • Ping funktioniert in AutoIt nicht zuverlässig. In der CMD aber problemlos.

    • BLinz
    • 29. Juni 2017 um 13:22
    Zitat von Bitnugger

    C:\pinz.exe znil.net -t

    PingZ-Statistik für...

    Da kann sich wohl jemand nicht entscheiden, wie er sein Tool benennen soll... :P

    In der Tat habe ich das Ding mehrmals umbenannt ... am Anfang war es ping+, irgendwann pingz und schließlich pinz.
    Ich finde das manchmal gar nicht so einfach dem Ding einen passenden, eindeutigen Namen zu geben ...

  • Programm mit vielen AdlibRegister() aufrufen / Performance / NICHT Multithreading/Parallelprozessing

    • BLinz
    • 28. Juni 2017 um 17:46

    Moin,

    Vorweg: da mein Programm zur Zeit mehr als 6800 Zeilen hat poste ich es hier erst einmal nicht.

    In meinem Programm mit GUI nutze ich unter anderem per AdlibRegister()

    • Funktion1 die per _Timer_GetIdleTime() auf den Bildschirmschoner achtet und bei Bedarf einen MouseMove macht (alle 1000ms)
    • Funktion2 die auf Nachrichten eines Clients per TCP wartet - Client Connected, Client Disconnected und Nachrichten im JSON-Format (alle 50ms)
    • Funktion3 die prüft ob das Programm selbst richtig läuft (ob Funktion 4 seine Arbeit macht oder ob es einen nicht korrigierbaren Fehler gab) (alle 6000ms)
    • Funktion4 die Aufträge abarbeitet (alle 1000ms)

    Alles natürlich im OnEventMode
    Nun hatte ich es heute das z.B. eine Nachricht des Clients untergegangen ist (Funktion2 stand da noch auf 100ms)
    Ich habe alle Funktionen überarbeitet so das diese sich wieder schnellstmöglich beenden (per Return),
    bei Zeitkritischen Vorgängen halte ich sogar die ggf. störenden Funktionen an und starte diese hinterher wieder.

    Ich hatte schon mit den Gedanken gespielt so viel wie möglich in jeweils eigene Programme (und damit .exe) auszulagern ... aber dann wird es mit der Kommunikation kompliziert.
    Wichtig wäre mir das Funktion2 immer Nachrichten empfängt, die anderen Funktionen dürfen Ihre Arbeit dafür unterbrechen / pausieren.

    Ich habe die AdlibRegister() so verstanden das

    • Er die Funktion4 z.B, alle 1000ms aufruft
    • In der Zeit in der Funktion4 läuft findet kein anderer Aufruf (z.B. von Funktion2 die ja alle 50ms laufen soll)
    • Und wenn Funktion4 60 Sekunden braucht dann steht auch so lange alles andere

    Ich hab mir Labels in die GUI gebaut die jedesmal die Farbe wechseln wenn die zugehörige Funktion aufgerufen wird. Das hat das ganze eher langsamer gemacht :D aber das vorher geschriebene meine ich dabei erkannt zu haben.


    Nach ein wenig Googeln hatte ich diesen Beitrag aus dem Forum gefunden: Multithreading in autoit

    @Mars schrieb dort folgendes:


    Code
    Die Elegantere Methode ist der OnEventMode oder allgemeinere Callbacks. Damit lassen sich fast alle Skripte zufriedenstellend parallelisieren. Weiterhin ist geschicktes anwenden von Timern eine schöne Möglichkeit Funktionen parallel arbeiten zu lassen. (Dazu muss eine Funktion nur in einer (oder mehreren) Statischen Variable(n) ihren aktuellen Zustand speichern um später an der alten Stelle weitermachen zu können)


    Hätte mal jemand ein paar Beispiele für mich was mit

    • allgemeinere Callbacks
    • geschicktes anwenden von Timern

    gemeint ist?
    Gibt es einen Befehl mit dem ich in der Funktion sagen kann "Arbeite mal eben deine AdlibRegister() ab und dann mache hier in der nächsten Zeile weiter"?

    In Erwartung einer interessanten Diskussion,
    BLinz

  • Ping funktioniert in AutoIt nicht zuverlässig. In der CMD aber problemlos.

    • BLinz
    • 28. Juni 2017 um 16:40

    Als Alternative: Ich habe mir zum privaten Spaß mal ein eigenes ping geschrieben - genannt pinz - ich wollte was mit grafischer Laufzeitanzeige.
    Das Script nutzt eine alternative Ping Methode _PingLikeMicrosoft() bei der man den Payload bestimmen kann (Ich hatte versucht alle Parameter des Original ping-Befehls umzusetzen.

    Kompiliert sich als CUI dann einfach wie Ping nutzen (statt dessen halt pinz.exe nutzen). Der Code ist "etwas" unordentlich da ich zum testen damals alles ziemlich zusammenkopiert habe ... und es dann in der Schublade verschwunden ist.
    Aber vielleicht hilft es dir.


    AutoIt: pinz.au3
    #NoTrayIcon
    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    ;~ #AutoIt3Wrapper_Icon=Icon256-32.ico
    #AutoIt3Wrapper_Outfile=pinz.exe
    #AutoIt3Wrapper_UseUpx=y
    #AutoIt3Wrapper_Change2CUI=y
    #AutoIt3Wrapper_Res_Description=pinz - Ping mit optischer Laufzeitdarstellung - znil.net
    #AutoIt3Wrapper_Res_Fileversion=0.0.0.101
    #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
    #AutoIt3Wrapper_Res_SaveSource=y
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include-once
    #Include <Array.au3>
    #Include <Inet.au3>
    #Include <Misc.au3>
    #include <WinAPI.au3>
    
    
    ; ****************************************************************************************
    ;     ##     ##    ###    ########  ####    ###    ########  ##       ########  ######
    ;     ##     ##   ## ##   ##     ##  ##    ## ##   ##     ## ##       ##       ##    ##
    ;     ##     ##  ##   ##  ##     ##  ##   ##   ##  ##     ## ##       ##       ##
    ;     ##     ## ##     ## ########   ##  ##     ## ########  ##       ######    ######
    ;      ##   ##  ######### ##   ##    ##  ######### ##     ## ##       ##             ##
    ;       ## ##   ##     ## ##    ##   ##  ##     ## ##     ## ##       ##       ##    ##
    ;        ###    ##     ## ##     ## #### ##     ## ########  ######## ########  ######
    ; ****************************************************************************************
    
    
    ; ***************************************************************************************************************************************
    ; Nachfolgendes wird für die "PingLikeMicrosoft" Function gebraucht
    ; Die wurde benötigt da ich bei der in AutoIt eingebauten Ping-Funktion nicht die Paket-Größe ändern kann
    ; Die Funktion habe ich hier gefunden: http://www.autoitscript.com/forum/topic/129525-ping-help/
    Global Const $IP_SUCCESS = 0
    Global Const $IP_STATUS_BASE = 11000
    Global Const $IP_BUF_TOO_SMALL = ($IP_STATUS_BASE + 1)
    Global Const $IP_DEST_NET_UNREACHABLE = ($IP_STATUS_BASE + 2)
    Global Const $IP_DEST_HOST_UNREACHABLE = ($IP_STATUS_BASE + 3)
    Global Const $IP_DEST_PROT_UNREACHABLE = ($IP_STATUS_BASE + 4)
    Global Const $IP_DEST_PORT_UNREACHABLE = ($IP_STATUS_BASE + 5)
    Global Const $IP_NO_RESOURCES = ($IP_STATUS_BASE + 6)
    Global Const $IP_BAD_OPTION = ($IP_STATUS_BASE + 7)
    Global Const $IP_HW_ERROR = ($IP_STATUS_BASE + 8)
    Global Const $IP_PACKET_TOO_BIG = ($IP_STATUS_BASE + 9)
    Global Const $IP_REQ_TIMED_OUT = ($IP_STATUS_BASE + 10)
    Global Const $IP_BAD_REQ = ($IP_STATUS_BASE + 11)
    Global Const $IP_BAD_ROUTE = ($IP_STATUS_BASE + 12)
    Global Const $IP_TTL_EXPIRED_TRANSIT = ($IP_STATUS_BASE + 13)
    Global Const $IP_TTL_EXPIRED_REASSEM = ($IP_STATUS_BASE + 14)
    Global Const $IP_PARAM_PROBLEM = ($IP_STATUS_BASE + 15)
    Global Const $IP_SOURCE_QUENCH = ($IP_STATUS_BASE + 16)
    Global Const $IP_OPTION_TOO_BIG = ($IP_STATUS_BASE + 17)
    Global Const $IP_BAD_DESTINATION = ($IP_STATUS_BASE + 18)
    Global Const $IP_ADDR_DELETED = ($IP_STATUS_BASE + 19)
    Global Const $IP_SPEC_MTU_CHANGE = ($IP_STATUS_BASE + 20)
    Global Const $IP_MTU_CHANGE = ($IP_STATUS_BASE + 21)
    Global Const $IP_UNLOAD = ($IP_STATUS_BASE + 22)
    Global Const $IP_ADDR_ADDED = ($IP_STATUS_BASE + 23)
    Global Const $IP_GENERAL_FAILURE = ($IP_STATUS_BASE + 50)
    Global Const $MAX_IP_STATUS = ($IP_STATUS_BASE + 50)
    Global Const $IP_PENDING = ($IP_STATUS_BASE + 255)
    Global Const $PING_TIMEOUT = 500
    Global Const $WS_VERSION_REQD = 0x101
    Global Const $MIN_SOCKETS_REQD = 1
    Global Const $SOCKET_ERROR = -1
    Global Const $INADDR_NONE = 0xFFFFFFFF
    Global Const $MAX_WSADescription = 256
    Global Const $MAX_WSASYSStatus = 128
    If @AutoItX64 Then Exit 0 * MsgBox(16, @ScriptName & " - Error", "ICMP structures only designed for 32-Bit Version")
    Global Const $ICMP_OPTIONS = _
    "ubyte Ttl;" & _
    "ubyte Tos;" & _
    "ubyte Flags;" & _
    "ubyte OptionsSize;" & _
    "ptr OptionsData" ; Options Data
    Global Const $tagICMP_ECHO_REPLY = _
    "ulong Address;" & _ ; IPAddr
    "ulong Status;" & _
    "ULONG RoundTripTime;" & _
    "USHORT DataSize;" & _
    "USHORT Reserved;" & _
    "ptr Data;" & _
    $ICMP_OPTIONS
    ; Vorstehendes wird für die "PingLikeMicrosoft" Function gebraucht
    ; ***************************************************************************************************************************************
    
    
    Dim $a_PingError[5]						; Enthält den Text für den Rückgabewert von "PingLikeMicrosoft" bei Fehlern
    Dim $i_PingTime							; hier steht drin welche Laufzeit der letzte Ping hatte - oder 0 wenn es nicht geklappt hat
    Dim $i_LastPingTime						; Wir merken uns für jeden Durchlauf die Pinglaufzeit vom mal davor für Vergleiche
    Dim $s_IP								; IP-Adresse des Hosts den wir anpingen
    Dim $s_DNS								; DNS-Name des Host den wir anpingen - wird vom DNS-Server abgefragt
    Dim $s_TargetHost						; Der vom Benutzer übergebende Zielhost als IP oder DNS oder NetBIOS-Name
    Dim $i_n = 4							; Anzahl der Pings, Standard ist 4 mal
    Global $i_Counter = 0					; Falls der Benutzer uns eine Anzahl n übergeben hat zählen wir hiermit mit wie oft wir schon gepingt haben
    Dim $i_Pause = 1000                     ; Wieviel Pause soll zwischen den einzelnen Pings erfolgen?
    Dim $s_Result                           ; In dieser Variablen wird die Ausgabezeile zusammengebaut
    Dim $i_LastResultLen                    ; Länge der letzten, vorherigen Ausgabezeile für Vergleiche
    Dim $i_PercentPingTime                  ; Pinglaufzeit in Prozent im Verhältnis zum noch freien Platz in der Zeile
    Dim $b_EndlessPing = False              ; Wird auf True gesetzt falls der Benutzer -t angegeben hat
    Dim $i_WindowSizeHorizontal             ; Wieviele Zeichen passen in eine Zeile - ausgelesen aus der Windows-Registry
    Dim $s_temp, $i_temp                    ; Temporäre Variablen
    Dim $i_TimeOut = 4000                   ; Maximale Wartezeit auf einen Ping
    Global $i_Packets_Send = 0              ; Zähler - wieviele Pings wurden gesendet
    Global $i_Packets_Receive = 0           ; Zähler - wieviele Antworten auf Pings haben wir erhalten?
    Global $i_PingTimeMin = 0               ; Schnellster Ping
    Global $i_PingTimeMax = 9999999999      ; langsamster Ping
    Global $i_timer                         ; Hilfsvariable mit der wir die Zeit messen in unserer Schleife
    Global $b_SkipPing = False              ; Hilfsvariable die gesetzt wird um das pingen zu überspringen
    Global $i_Error
    Global $i_Extended
    
    
    ; Das normale ping sendet 32 Bytes ... das machen wir auch in dem wir eine Zeichenfolge dieser Länge senden.
    ; Indem wir die Zeichenfolge verlängern oder verkürzen können wir diesen Wert später anpassen
    ;                          1         2         3
    ;                 12345678901234567890123456789032
    Dim $s_Payload = "abcdefghijklmnopqrstuvwabcdefghi" ; 32 Bytes!
    Dim $s_Payload = "pinz -- ping von http://znil.net" ; 32 Bytes!
    
    
    
    
    ; Wir holen uns einen Zeiger auf das aktuelle Fenster - brauchen wir für das Abfangen von STRG + C
    Global $sDllValue, $DOSBOCHandle
    $sDllValue = DllCall( "Kernel32.dll","hwnd","GetConsoleWindow")
    $DOSBOCHandle = $sDllValue[0]
    
    
    
    
    ; Anzahl der Zeichen pro Zeile ermitteln aus den Default Werten der Registry
    $s_temp = Hex(RegRead("HKCU\Console", "WindowSize"), 4) ; in den letzten 4 Zeichen steht die Horizontale Breite
    $i_WindowSizeHorizontal = Dec($s_temp)
    
    
    
    
    ;                   	     10        20        30        40        50        60        70        80
    ;                 	12345678901234567890123456789012345678901234567890123456789012345678901234567890
    Dim $s_Header = _
    					"+------------------------------------------------------------------------------" & @CRLF & _
    					"| pinz.exe - Version " & FileGetVersion(@ScriptName) & @CRLF & _
    					"+------------------------------------------------------------------------------" & @CRLF & _
    					"| 2015 von Bernhard Linz für http://znil.net - Kontakt: Bernhard@znil.net" & @CRLF & _
    					"+------------------------------------------------------------------------------" & @CRLF & _
    					@CRLF
    
    
    ;                            10        20        30        40        50        60        70        80
    ;                 	12345678901234567890123456789012345678901234567890123456789012345678901234567890
    Dim $s_HilfeText = _
    					"Pinz - Ein ping Programm welches die Laufzeit des Pings optisch darstellt" &  @CRLF & _
    					"-------------------------------------------------------------------------------" & @CRLF & _
    					@CRLF & _
    					"Aufruf: " & @CRLF & _
    					@CRLF & _
    					@ScriptName & " Ziel [-t]" & @CRLF & _
    					@CRLF & _
    					"Ziel             : IP-Adresse (IPv4 oder IPv6) oder NetBIOS-Name oder" & @CRLF & _
    					"                   DNS-Name des Ziels" & @CRLF & _
    					@CRLF & _
    					" -t              : Kontinuierlich pingen bis das Programm per STRG + C gestoppt" & @CRLF & _
    					"                   wird" & @CRLF & _
    					@CRLF & _
    					" -n Anzahl       : Anzahl von Pinganforderungen die gesendet werden sollen," & @CRLF & _
    					"                   Standard ist 4" & @CRLF & _
    					@CRLF & _
    					" -l Größe        : Größe der Datenpakete in Bytes, STandard sind 32 Bytes" & @CRLF & _
    					@CRLF & _
    					" -p Zeit         : Pause zwischen den einzelnen Pings in Millisekunden," & @CRLF & _
    					"                   Standard ist 1.000 = 1s" & @CRLF & _
    					@CRLF & _
    					" -w Zeitlimit    : Zeitlimit in Millisekunden für eine Rückmeldung." & @CRLF & _
    					@CRLF & _
    					"+------------------------------------------------------------------------------" & @CRLF & _
    					"| pinz.exe ist FREEWARE!" & @CRLF & _
    					"| Kopieren, weitergeben ausdrücklich erlaubt!" & @CRLF & _
    					"| Die jeweils aktuelleste Version und Anleitungen findet Ihr unter:" & @CRLF & _
    					"| http://znil.net/index.php?title=pinz" & @CRLF & _
    					"+------------------------------------------------------------------------------" & @CRLF
    
    
    ; Fehlertexte für "PingLikeMicrosoft" setzen
    $a_PingError[1] = "Zielhost ist Offline"
    $a_PingError[2] = "Zielhost nicht erreichbar "
    $a_PingError[3] = "unbekanntes Ziel"
    $a_PingError[4] = "Netzwerkfehler"
    
    
    ; *************************************************************************************
    ;    ######## ##     ## ##    ##  ######  ######## ####  #######  ##    ##  ######
    ;    ##       ##     ## ###   ## ##    ##    ##     ##  ##     ## ###   ## ##    ##
    ;    ##       ##     ## ####  ## ##          ##     ##  ##     ## ####  ## ##
    ;    ######   ##     ## ## ## ## ##          ##     ##  ##     ## ## ## ##  ######
    ;    ##       ##     ## ##  #### ##          ##     ##  ##     ## ##  ####       ##
    ;    ##       ##     ## ##   ### ##    ##    ##     ##  ##     ## ##   ### ##    ##
    ;    ##        #######  ##    ##  ######     ##    ####  #######  ##    ##  ######
    ; *************************************************************************************
    
    
    
    
    ;           #    #     #  #####  ###  #####  ####### ####### #     #
    ;          # #   ##    # #     #  #  #     # #     # #       ##   ##
    ;         #   #  # #   # #        #        # #     # #       # # # #
    ;        #     # #  #  #  #####   #   #####  #     # #####   #  #  #
    ;        ####### #   # #       #  #  #       #     # #       #     #
    ;        #     # #    ## #     #  #  #       #     # #       #     #
    ;        #     # #     #  #####  ### ####### ####### ####### #     #
    ;#######
    ; _ANSI2OEM löst das Problem mit dem Umlauten und anderen Sonderzeichen. Es wandelt Text so um das er korrekt in der DOS-Box dargestellt wird
    ; So können hier im Quellcode auch Umlaute verwendet werden (in den Textausgaben) und diese werden dann korrekt dargestellt
    Func _ANSI2OEM($text)
    	$text = DllCall('user32.dll', 'Int', 'CharToOem', 'str', $text, 'str', '')
    	Return $text[2]
    	;Return $text
    EndFunc   ;==>_ANSI2OEM
    
    
    
    
    ;        #     #                           #
    ;        #     # # #      ###### ######   # #   #    #  ####   ####  ###### #####  ###### #    #
    ;        #     # # #      #      #       #   #  #    # #      #    # #      #    # #      ##   #
    ;        ####### # #      #####  #####  #     # #    #  ####  #      #####  #####  #####  # #  #
    ;        #     # # #      #      #      ####### #    #      # #  ### #      #    # #      #  # #
    ;        #     # # #      #      #      #     # #    # #    # #    # #      #    # #      #   ##
    ;        #     # # ###### #      ###### #     #  ####   ####   ####  ###### #####  ###### #    #
    ;#######
    ; Hilfsroutine die den Hilfetext ausgibt
    Func _HilfeAusgeben()
    	ConsoleWrite(_ANSI2OEM($s_Header))
    	ConsoleWrite(_ANSI2OEM($s_HilfeText))
    EndFunc   ;==>_HilfeAusgeben
    
    
    
    
    ;         #####  ####### ######  #                #####
    ;        #     #    #    #     # #               #     #
    ;        #          #    #     # #               #
    ;        #          #    ######  #               #
    ;        #          #    #   #   #               #
    ;        #     #    #    #    #  #               #     #
    ;         #####     #    #     # #######          #####
    ;#######                                 #######
    ; die Tastenkombination STRG +C abfangen um dann eine Zusammenfassung auszugeben
    Func _CTRL_C()
    	If WinActive( $DOSBOCHandle, "" ) Then
    		; Unser Fenster ist gerade aktiv!
    		_WriteStatistics()
    		; Abfangen von STRG + C aufheben
    		HotKeySet( "^c" )
    		Exit $i_Error
    	Else
    		; Es wurde zwar STRG + C gedrückt - das war aber nicht für uns bestimmt
    		; Wir senden deshalb den Tastendruck weiter
    		HotKeySet( "^c" )
    		Send( "^c" )
    		HotKeySet( "^c","_CTRL_C" )
    	EndIf
    EndFunc
    
    
    
    
    ;        #     #                        #####
    ;        #  #  # #####  # ##### ###### #     # #####   ##   ##### #  ####  ##### #  ####   ####
    ;        #  #  # #    # #   #   #      #         #    #  #    #   # #        #   # #    # #
    ;        #  #  # #    # #   #   #####   #####    #   #    #   #   #  ####    #   # #       ####
    ;        #  #  # #####  #   #   #            #   #   ######   #   #      #   #   # #           #
    ;        #  #  # #   #  #   #   #      #     #   #   #    #   #   # #    #   #   # #    # #    #
    ;         ## ##  #    # #   #   ######  #####    #   #    #   #   #  ####    #   #  ####   ####
    ;#######
    Func _WriteStatistics()
    	Local $i_Packets_Lost
    	If $i_Packets_Send > 0 Then
    		If $i_PingTimeMax = 9999999999 Then
    			$i_PingTimeMax = 0
    		EndIf
    		$i_Packets_Lost = Int(($i_Packets_Send - $i_Packets_Receive) / $i_Packets_Send * 100)
    		; eben noch sicher gehen das der Prozentwert nicht größer als 100 oder kleiner als 0 ist - kann passieren wenn vor dem ersten Ping schon abgebrochen wird
    		If $i_Packets_Lost < 0 Then
    			$i_Packets_Lost = 0
    		EndIf
    		If $i_Packets_Lost > 100 Then
    			$i_Packets_Lost = 100
    		EndIf
    		ConsoleWrite(@CRLF)
    		ConsoleWrite(_ANSI2OEM("PingZ-Statistik für " & $s_IP & ":" & @CRLF))
    		ConsoleWrite("     Pakete: Gesendet = " & $i_Packets_Send & ", Empfangen = " & $i_Packets_Receive & ", Verloren = " & ($i_Packets_Send - $i_Packets_Receive) & @CRLF)
    		ConsoleWrite("     (" & $i_Packets_Lost & "% Verlust)," & @CRLF)
    		ConsoleWrite("Ca. Zeitangaben in Millisekunden:" & @CRLF)
    		ConsoleWrite("     Minimum = " & $i_PingTimeMin & "ms, Maximum = " & $i_PingTimeMax & "ms, Mittelwert = " & Int(($i_PingTimeMin + $i_PingTimeMax) / 2) & "ms" & @CRLF)
    	EndIf
    EndFunc
    
    
    
    
    
    
    ; Nachfolgendes wird für die "PingLikeMicrosoft" Function gebraucht
    ; Die wurde benötigt da ich bei der in AutoIt eingebauten Ping-Funktion nicht die Paket-Größe ändern kann
    ; Die Funktion habe ich hier gefunden: http://www.autoitscript.com/forum/topic/129525-ping-help/
    Func _IcmpCustomPayload($sAddress, $sDataToSend, ByRef $ECHO, $PING_TIMEOUT = 4000) ; ECHO As ICMP_ECHO_REPLY
    	; $ECHO receives an ICMP_ECHO_REPLY on success
    	; by Prog@ndy, used VBSource from http://vbnet.mvps.org/index.html?code/internet/ping.htm
    	; on success return 1 , else 0
    	Local $return = 0, $error = 0
    	;~   'If Ping succeeds :
    	;~   '.RoundTripTime = time in ms for the ping to complete,
    	;~   '.Data is the data returned (NULL terminated)
    	;~   '.Address is the Ip address that actually replied
    	;~   '.DataSize is the size of the string in .Data
    	;~   '.Status will be 0
    	;~   '
    	;~   'If Ping fails .Status will be the error code
    	Local $WSOCK32DLL = DllOpen("wsock32.dll")
    	; use Icmp.dll for: Windows 2000 Server and Windows 2000 Professional
    	;Local $ICMPDLL = DllOpen("icmp.dll")
    	; use Iphlpapi.dll for: Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP
    	Local $ICMPDLL = DllOpen("Iphlpapi.dll")
    	Local $hPort ;As Long
    	Local $dwAddress ;As Long
    	Local $INADDR_NONE = -1
    	;~ If Not StringRegExp($sAddress,"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}") Then
    	;~   TCPStartup()
    	;~   $sAddress = TCPNameToIP($sAddress)
    	;~   TCPShutdown()
    	;~ EndIf
    	;~   'convert the address into a long representation
    	$dwAddress = DllCall($WSOCK32DLL, "uint", "inet_addr", "str", $sAddress)
    	$dwAddress = $dwAddress[0]
    	;~   'if a valid address..
    	If $dwAddress <> $INADDR_NONE Or $sAddress = "255.255.255.255" Then
    		;~  'open a port
    		$hPort = DllCall($ICMPDLL, "hwnd", "IcmpCreateFile")
    		$hPort = $hPort[0]
    		;~  'and if successful,
    		If $hPort Then
    			$ECHO = DllStructCreate($tagICMP_ECHO_REPLY & ";char[355]")
    			;~	 'ping it.
    			Local $ret = _IcmpSendEcho($hPort, _
    				$dwAddress, _
    				$sDataToSend, _
    				StringLen($sDataToSend), _
    				0, _
    				DllStructGetPtr($ECHO), _
    				DllStructGetSize($ECHO), _
    				$PING_TIMEOUT, _
    				$ICMPDLL)
    				;~	 'return the status as ping succes and close
    				$error = DllStructGetData($ECHO, "Status")
    			If $error = $IP_SUCCESS Then $return = 1
    			DllCall($ICMPDLL, "uint", "IcmpCloseHandle", "hwnd", $hPort)
    		EndIf
    	Else
    		;~	 'the address format was probably invalid
    		$return = 0
    		$error = $INADDR_NONE
    	EndIf
    	DllClose($WSOCK32DLL)
    	DllClose($ICMPDLL)
    	Return SetError($error, 0, $return)
    EndFunc   ;==>_IcmpCustomPayload
    
    
    ; by BugFix, modified by Prog@ndy
    ; für 1000 < @error < 1004 is der error von Dllcall. Die DllCall-Fehlernummer ist dabei @error/1000
    Func _IcmpSendEcho($IcmpHandle, $DestinationAddress, $RequestData, $RequestSize, $RequestOptions, $ReplyBuffer, $ReplySize, $Timeout, $ICMPDLL = "icmp.dll")
    	Local $ret = DllCall($ICMPDLL, "dword", "IcmpSendEcho", _
    		"hwnd", $IcmpHandle, _
    		"uint", $DestinationAddress, _
    		"str", $RequestData, _
    		"dword", $RequestSize, _
    		"ptr", $RequestOptions, _
    		"ptr", $ReplyBuffer, _
    		"dword", $ReplySize, _
    		"dword", $Timeout)
    	If @error Then Return SetError(@error+1000, 0, 0)
    	Return $ret[0]
    EndFunc   ;==>_IcmpSendEcho
    
    
    Func _PingLikeMicrosoft($DestinationAddress, $Timeout = 4000, $sPayLoad = "abcdefghijklmnopqrstuvwabcdefghi")
    	; function created by CUNNINGT
    	Local $ECHORet
    	Local $pingSucess = _IcmpCustomPayload($DestinationAddress, $sPayLoad, $ECHORet, $Timeout)
    	If @error Then
    		Switch @error
    			Case $IP_REQ_TIMED_OUT
    				$i_Error = 1
    				$i_Extended = 1
    				Return SetError(1, 1)
    			Case $IP_DEST_HOST_UNREACHABLE
    				$i_Error = 1
    				$i_Extended = 2
    				Return SetError(1, 2)
    			Case $IP_BAD_DESTINATION
    				$i_Error = 1
    				$i_Extended = 3
    				Return SetError(1, 3)
    			Case Else
    				$i_Error = 1
    				$i_Extended = 4
    				Return SetError(1, 4)
    		EndSwitch
    	Else
    		$i_Error = 0
    		$i_Extended = 0
    		Return DllStructGetData($ECHORet, "RoundTripTime")
    	EndIf
    EndFunc   ;==>_PingLikeMicrosoft
    
    
    ; ****************************************
    ;    ##     ##    ###    #### ##    ##
    ;    ###   ###   ## ##    ##  ###   ##
    ;    #### ####  ##   ##   ##  ####  ##
    ;    ## ### ## ##     ##  ##  ## ## ##
    ;    ##     ## #########  ##  ##  ####
    ;    ##     ## ##     ##  ##  ##   ###
    ;    ##     ## ##     ## #### ##    ##
    ; ****************************************
    
    
    ; falls keine Parameter angegeben wurden die Hilfe ausgeben
    If $CmdLine[0] = 0 Then
    	_HilfeAusgeben()
    	Exit 0
    EndIf
    ;testen ob der Parameter 1 ist auf "/?" testen und ebenfalls Hilfe ausgeben
    If $CmdLine[1] = "/?" Then
    	_HilfeAusgeben()
    	Exit 0
    EndIf
    
    
    ; Die übergebenen Parameter auswerten und zuordnen
    For $i = 1 To $CmdLine[0]
    	If StringLeft($CmdLine[$i], 2) = "-t" Then
    		; Dauerping!
    		$b_EndlessPing = True
    	ElseIf StringLeft($CmdLine[$i], 2) = "-n" Then
    		; Bestimmte Anzahl von Ping senden
    		If $CmdLine[0] >= ($i + 1) Then
    			$i = $i + 1
    			$i_n = Int($CmdLine[$i])
    			If $i_n < 1 Then
    				$i_n = 4
    			EndIf
    		Else
    			ConsoleWrite(_ANSI2OEM("Der Wert muss für die Option angegeben werden: -n" & @CRLF))
    			Exit 1
    		EndIf
    	ElseIf StringLeft($CmdLine[$i], 2) = "-p" Then
    
    
    		If $CmdLine[0] >= ($i + 1) Then
    			$i = $i + 1
    			$i_Pause = Int($CmdLine[$i])
    		Else
    			ConsoleWrite(_ANSI2OEM("Der Wert muss für die Option angegeben werden: -p" & @CRLF))
    			Exit 1
    		EndIf
    	ElseIf StringLeft($CmdLine[$i], 2) = "-l" Then
    		If $CmdLine[0] >= ($i + 1) Then
    			$i = $i + 1
    			$i_temp = Int($CmdLine[$i])
    			If $i_temp < 1 Then
    				$i_temp = 32
    			EndIf
    			$s_Payload = ""
    			For $j = 1 To $i_temp
    				$s_Payload = $s_Payload & "z"
    			Next
    		EndIf
    	ElseIf StringLeft($CmdLine[$i], 2) = "-w" Then
    		If $CmdLine[0] >= ($i + 1) Then
    			$i = $i + 1
    			$i_TimeOut = Int($CmdLine[$i])
    			If $i_TimeOut < 1 Then
    				$i_TimeOut = 4000
    			EndIf
    			ConsoleWrite("Timneout: " & $i_TimeOut & @CRLF)
    		Else
    			ConsoleWrite(_ANSI2OEM("Der Wert muss für die Option angegeben werden: -w" & @CRLF))
    			Exit 1
    		EndIf
    	Else
    		$s_TargetHost = $CmdLine[$i]
    	EndIf
    Next
    
    
    HotKeySet("^c", "_CTRL_C")
    
    
    
    
    TCPStartup()
    
    
    $s_IP = TCPNameToIP($s_TargetHost)
    $s_DNS = _TCPIpToName($s_IP)
    TCPShutdown ( )
    
    
    If $s_IP = "" Then
    	ConsoleWrite(_ANSI2OEM("pinz konnte Host " & $s_TargetHost & " nicht finden. Überprüfen Sie den Namen, und versuchen Sie es erneut." & @CRLF))
    	Exit 1
    EndIf
    
    
    ConsoleWrite(@CRLF)
    If $s_DNS = "" Then
    	ConsoleWrite(_ANSI2OEM("pinz wird ausgeführt für " & $s_IP & " mit " & StringLen($s_Payload) & " Bytes Daten:" & @CRLF))
    Else
    	ConsoleWrite(_ANSI2OEM("pinz wird ausgeführt für " & $s_DNS & " [" & $s_IP & "] mit " & StringLen($s_Payload) & " Bytes Daten:" & @CRLF))
    EndIf
    
    
    
    
    
    
    While 1
    	If $b_SkipPing = False Then
    		$i_Packets_Send = $i_Packets_Send + 1
    		;$s_Result = "Antwort von " & $s_IP & ": "
    		$s_Result = " " & $s_IP & ": "
    		If $s_IP = "127.0.0.1" Then
    			$i_PingTime = Ping($s_IP, $i_TimeOut)
    		Else
    			$i_PingTime = _PingLikeMicrosoft($s_IP, $i_TimeOut, $s_Payload)
    		EndIf
    		;  When the function fails, @error contains extended information:
    		;    1 = Host is offline
    		;    2 = Host is unreachable
    		;    3 = Bad destination
    		;    4 = Other errors
    ;~ 		MsgBox(0,"",@error & ";" & @extended)
    		If $i_Error > 0 Then
    			$a_PingError[0] = _ANSI2OEM(" Zeitüberschreitung (" & $a_PingError[$i_Extended] & ")" )
    			If $i_Extended > 0 Then
    				$s_Result = $s_Result & "       " & Chr(195) & " " & $a_PingError[$i_Extended]
    			Else
    ;~ 				$s_Result = $s_Result & "       " & Chr(179) & _ANSI2OEM(" Zeitüberschreitung (>") & $i_TimeOut & "ms)"
    				$s_Result = StringTrimRight($s_Result, 1)
    				For $i = 1 To (4 - StringLen($i_TimeOut))
    					$s_Result = $s_Result & " "
    				Next
    				$s_Result = $s_Result & ">" & $i_TimeOut & "ms " & Chr(179)
    			EndIf
    			$i_PingTime = 0
    		EndIf
    		If $i_PingTime > $i_TimeOut Then
    			$i_PingTime = 0
    			;ConsoleWrite("Result: " & $s_Result & @CRLF)
    			$s_Result = StringTrimRight($s_Result, 1)
    			For $i = 1 To (4 - StringLen($i_TimeOut))
    				$s_Result = $s_Result & " "
    			Next
    			$s_Result = $s_Result & ">" & $i_TimeOut & "ms " & Chr(179)
    		EndIf
    		If $i_PingTime >= 0 And $i_Error = 0 Then
    			For $i = 1 To (4 - StringLen($i_PingTime))
    				$s_Result = $s_Result & " "
    			Next
    			$i_Packets_Receive = $i_Packets_Receive + 1
    			If $i_PingTime < $i_PingTimeMax Then
    				$i_PingTimeMax = $i_PingTime
    			EndIf
    			If $i_PingTime > $i_PingTimeMin Then
    				$i_PingTimeMin = $i_PingTime
    			EndIf
    	;~ 		$s_Result = $s_Result & $i_PingTime & "ms |"
    			$s_Result = $s_Result & $i_PingTime & "ms " & Chr(195)
    		EndIf
    		; So, String sollte jetzt genau 8 Zeichen lang sein, bleiben noch 72 für Anzeige
    		If $i_PingTime < ($i_WindowSizeHorizontal - StringLen($s_Result)) Then
    			; Variante 1: Ping ist unter maximalen Fensterbreite
    			For $i = 1 To ($i_PingTime)
    	;~ 			$s_Result = $s_Result & "-"
    	;~ 			$s_Result = $s_Result & Chr(196) ; Pfeilspitze
    	;~ 			$s_Result = $s_Result & Chr(178) ; grauer Kasten 1
    	;~ 			$s_Result = $s_Result & Chr(219) ; voller Kasten
    				$s_Result = $s_Result & Chr(254) ; voller Kasten klein
    			Next
    		Else
    			; Neue Variante 2: Wir kürzen den Wert auf unter 100!
    			$i_PercentPingTime = Int(StringRight($i_PingTime, 2))
    			If $i_PercentPingTime > ($i_WindowSizeHorizontal - StringLen($s_Result)) Then
    				; In Prozente umrechnen im Verhältnis zu den freien Zeichen
    				$i_PercentPingTime = Int(($i_WindowSizeHorizontal - StringLen($s_Result)) / $i_PercentPingTime * 100)
    				; Aus den Prozenten wieder die Anzahl der Zeichen errechnen
    				$i_PercentPingTime = Int(($i_WindowSizeHorizontal - StringLen($s_Result)) * $i_PercentPingTime / 100)
    			EndIf
    	;~ 		ConsoleWrite("Breite der Konsole              : " & $i_WindowSizeHorizontal & @CRLF)
    	;~ 		ConsoleWrite("Bisherige Länge                 : " & StringLen($s_Result) & @CRLF)
    	;~ 		ConsoleWrite("Noch freie Zeichen in der Zeile : " & ($i_WindowSizeHorizontal - StringLen($s_Result)) & @CRLF)
    	;~ 		ConsoleWrite("Geplante Zeichen                : " & ($i_PercentPingTime - 1) & @CRLF)
    	;~ 		ConsoleWrite("Summe:                          : " & (StringLen($s_Result) + $i_PercentPingTime) & @CRLF)
    
    
    			For $i = 1 To ($i_PercentPingTime - 1)
    	;~ 			$s_Result = $s_Result & "-"
    	;~ 			$s_Result = $s_Result & Chr(196) ; Pfeilspitze
    	;~ 			$s_Result = $s_Result & Chr(178) ; grauer Kasten 1
    	;~ 			$s_Result = $s_Result & Chr(219) ; voller Kasten
    				$s_Result = $s_Result & Chr(254) ; voller Kasten klein
    			Next
    		EndIf
    
    
    	;~ 	If $i_PingTime > $i_LastPingTime Then
    	;~ 		$s_Result = $s_Result & Chr(16)
    	;~ 	ElseIf $i_PingTime = $i_LastPingTime Then
    	;~ 		$s_Result = $s_Result & Chr(16)
    	;~ 	Else
    	;~ 		$s_Result = $s_Result & Chr(16)
    	;~ 	EndIf
    
    
    	;~ 	If $i_PingTime <= 0 Then
    	;~ 		$s_Result = $s_Result & _ANSI2OEM(" Zeitüberschreitung (") & $i_TimeOut & "ms)"
    	;~ 	EndIf
    
    
    		If ($i_LastPingTime < $i_PingTime) And ($i_LastResultLen = StringLen($s_Result)) Then
    			$s_Result = $s_Result & Chr(254)
    		EndIf
    		If ($i_LastPingTime > $i_PingTime) And ($i_LastResultLen = StringLen($s_Result)) Then
    			$s_Result = StringTrimRight($s_Result, 1)
    		EndIf
    
    
    
    
    		ConsoleWrite($s_Result & @CRLF)
    		$i_LastResultLen = StringLen($s_Result)
    
    
    	EndIf
    	; Sleep($i_Pause)
    
    
    	$i_LastPingTime = $i_PingTime
    
    
    	If $b_SkipPing = False Then
    		$i_timer = TimerInit()
    		$b_SkipPing = True
    	EndIf
    	If $b_SkipPing = True Then
    		If TimerDiff($i_timer) > $i_Pause Then
    ;~ 			ConsoleWrite(TimerDiff($i_timer) & "ms" & @CRLF)
    			$b_SkipPing = False
    			If $b_EndlessPing = False Then
    				$i_Counter = $i_Counter + 1
    				If $i_Counter >= $i_n Then
    					ExitLoop
    				EndIf
    			EndIf
    		Else
    			Sleep(100)
    		EndIf
    	EndIf
    WEnd
    
    
    _WriteStatistics()
    Exit $i_Error
    Alles anzeigen

    Überall wo ich mir den Code von extern zusammenkopiert habe sind die Original Links drin, bekannte Namen aus diesem Forum sind auch dabei.
    Warum auch immer gab es ein Problem beim anpingen des Localhost, nur dann wird das Interne Ping von AutoIt genutzt, ansonsten das _PingLikeMicrosoft()

    [Blockierte Grafik: https://znil.net/images/c/c8/ClipCapIt-170628-163755.PNG]

    Eventuell löst das ja dein Problem und du kannst dir die passenden Infos aus dem Skript rauskopieren.
    Das Skript gibt übrigens auch einen korrekten %ERRORCODE% zurück, mit dem original Ping hatte ich da auch mal meine Probleme in einem Batch-Skript.


    Gruß,
    BLinz

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™