Aufgabe mit AutoIt lösbar?

  • Hallo zusammen :)
    Als totaler Anfänger (und Neuling bei AutoIt) hätte ich eine Frage, ob ich mit AutoIt zur Lösung meines Problems kommen könnte und sich die Einarbeitung in das Programm überhaupt lohnen würde.

    Ich habe eine Text-Datei mit den Variablen A1, A2, A3, B1, B2, B3, etc.
    Neben den Variablen steht jeweils ein Buchstabe, sieht dann so aus:
    A1:P
    A2:M
    A3:B
    B1:C
    B2:L
    etc.
    Die Abtrennung könnte statt des Doppelpunkts auch durch andere Zeichen erfolgen oder ganz wegfallen.

    Kann ich mit AutoIt ein externes Programm starten lassen ("123.EXE"), welches ein neues Fenster öffnet, und mittels der Text-Datei darin zu den dort angeforderten Variablen die zugehörigen Buchstaben automatisch eintragen lassen?
    Die Abfrage des Programmes lautet: "Geben Sie die Werte (B1) (A3) ein"
    Ich möchte jetzt nicht unbedingt Stunden/Tage eventuell sinnlos damit verbringen, das Problem bewältigen zu versuchen, wenn das mit AutoIt gar nicht möglich ist.
    Danke :)

  • So ganz verstehe ich dein Problem nicht.
    Wenn du dein Programm startest ("123.EXE") wird ein Fenster angezeigt.
    In diesen Fenster befindet sich die Beschriftung "Geben Sie die Werte (B1) (A3) ein".
    Nun möchtest du die Werte die in der Text Datei hinterlegt sind in das gestartete Programm eingeben?
    Und das automatisch? Habe ich das so richtig verstanden?
    -> Das wäre dann so möglich mit AutoIt

  • Klar geht das.
    Du hast Schlüssel-Wert-Paare.
    Ideal als Datenstruktur für sowas wäre ein Dictionary.
    Mal als Beispiel:

    Spoiler anzeigen
    [autoit]

    $o_Dic = ObjCreate("Scripting.Dictionary")

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

    $o_Dic("A1") = "P"
    $o_Dic("A2") = "M"
    $o_Dic("A3") = "B"
    $o_Dic("B1") = "C"
    $o_Dic("B2") = "L"

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

    $s_Key = "A3"

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

    MsgBox(0,"", "Wert für " & $s_Key & ": " & $o_Dic($s_Key))

    [/autoit]

    Im Prinzip musst du nur noch das Dictionary mit dem Inhalt deiner Datei befüllen lassen.

  • Danke für die schnellen Antworten und für das Dictionary-Beispiel! :)

    Heute hat sich leider alles durch ein neues Programm völlig geändert.
    Jetzt muss ich folgendes hinbekommen:

    1. das Fremdprogramm zur VPN-Verbindung "blabla.exe" soll automatisch starten
    2. in dem neuen Fenster soll jetzt automatisch die Schaltfläche "Connect" angeklickt werden (geht aber nicht mit Return/Enter)
    3. danach erscheint links daneben ein zusätzliches Fenster mit der Eingabemöglichkeit für das Passwort; soll automatisch eingetragen werden, Cursor blinkt schon an der richtigen Stelle, danach soll Return/Enter für "OK" erfolgen (ist schon markiert)
    4. ein weiteres Fenster hat dann eine Eingabezeile mit blinkendem Cursor; darunter steht "Enter [C3] [A2] [F5]" - diese Werte/Koordinaten habe ich in einer Textdatei abgespeichert.
    5. wenn diese Werte automatisch "gelesen" und eingetragen wurden, reicht ein Enter für "Continue" (ist schon markiert)

    Wie viel Zeit müsste ich ungefähr investieren, um das als absoluter Anfänger zu schaffen? Habe momentan quasi noch gar keine Ahnung von AutoIt.

    Einmal editiert, zuletzt von Alex083 (26. Februar 2014 um 20:36)

  • Wie viel Zeit du brauchst kann man schwer sagen. Aber es sollte in angemessener Zeit zu bewältigen sein.

    Hier ein paar Tipps:
    1. kannst du mit Run machen
    2. nimm ControlClick oder MouseClick
    3. einfach Send und abschließend Send("{Enter}")
    4. siehe vorige Antworten (zum Auslesen der Datei FileOpen, FileRead(Line) und FileClose verwenden)
    5. Send("{Enter}")

    Und: WinWaitActive bei den erscheinenden Fenstern nicht vergessen.

    Viel Spaß beim Skripten! :D

    • Offizieller Beitrag

    Bevor du Send() verwendest, solltest du erst mal mit AutoItWindow-Info überprüfen, ob die Control des Programms evtl. auch Windows-tauglich sind und direkt angesprochen werden können. Schau dir dazu die Control..-Befehle an

    [autoit]

    ControlCommand
    ControlClick
    ; usw.

    [/autoit]
  • Danke für jede Antwort! Ihr habt mir echt Mut gemacht, das auszuprobieren.
    Ehrlich gesagt hatte ich wirklich Schiss davor, das Thema "AutoIt" überhaupt anzugreifen, bin aber äußerst positiv überrascht! :)
    Das Mini-Script funktioniert jedenfalls:


    Run("C:\Programme\abc.exe")
    Sleep(10000)
    ControlClick("abc-1", "", "[ID:121]")
    Sleep(10000)
    Send("xxxxxxx")
    Sleep(10000)
    ControlClick("abc-123", "", "[ID:254]")

    Jetzt stehe ich aber wirklich auf dem Schlauch (FileRead etc.):
    1. "Datenbank" erstellen (A1=C, A2=3 etc.)
    2. Auslesen der angeforderten Werte
    3. Eintragen der Werte in das Feld

    Danke!

  • Da es sich hierbei um einheitliche und einfache Werte handelt würde ich evtl. "IniRead" und "IniWrite" verwenden.

    [autoit]


    $sIniFile = "C:\Werte.ini"
    $sA1 = IniRead($sIniFile, "Main", "A1", "kein Wert vorhanden")
    MsgBox(0, "Ergebnis", $sA1)

    [/autoit]

    Viele Grüsse

  • Vielen Dank! :)

    Ini-Datei ist erstellt, Auslesen und Ausgabe in Messagebox klappt auch mit einem Wert.
    Es sind jedoch drei Werte, die ausgelesen werden und direkt nebeneinander angezeigt/gesendet werden sollen (s.u.).
    Das bekomme ich einfach nicht hin.

    Das zweite Problem ist immer noch die Abfrage der drei Werte.
    Immerhin habe ich es hinbekommen, dass der Text aus dem angezeigten Fenster in eine Messagebox geschickt wird (mit ControlGetText hat es nicht funktioniert):

    $text = WinGetText("Fenstername", "")
    MsgBox(0, "Textinhalt:", $text)

    Damit ist der gesamte Fensterinhalt in der Box sichtbar:
    "Blabla blub [C2] [A4] [G1] blabla bla"; benötigt werden nur die drei Werte innerhalb der eckigen Klammern.

    Wie kann ich die nun auslesen und an die ini-Abfrage weitergeben?

    Tausend Dank!

    • Offizieller Beitrag

    Also wenn du den Text nur auf diese Art lesen kannst, lässt sich z.B. so der Inhalt der eckigen Klammern selektieren:

    [autoit]


    $sText = "Blabla blub [C2] [A4] [G1] blabla bla"
    $aMatch = StringRegExp($sText, "\[([^\]]+)", 3)
    For $i = 0 To UBound($aMatch) -1
    ConsoleWrite('Match Nr. ' & $i+1 & ': ' & $aMatch[$i] & @LF)
    Next

    [/autoit]
  • Merci!!! Aber den Teil verstehe ich jetzt programmtechnisch überhaupt nicht mehr. ;(
    Wie kombiniere ich das dann mit der vorhergehenden Abfrage
    $text = WinGetText("Fenstername", "")
    und danach mit meiner *.ini-Datei, damit die entsprechenden Werte per "Send" eingetragen werden?
    Wie gesagt, bin absoluter Anfänger.
    Danke für die Geduld!

  • Sorry, wahrscheinlich schreibe ich das alles zu unverständlich, weil ich mich mit Programmieren nicht auskenne.
    Mit dem C64 habe ich damals noch etwas BASIC hinbekommen, aber das war's dann auch schon gewesen.

    $text = WinGetText("Fenstername", "")
    erfasst ja den Text aus dem angezeigten Fenster:
    Blabla blub [C2] [A4] [G1] blabla bla
    Mit

    MsgBox(0, "Textinhalt:", $text)
    wird der abgefragte Text korrekt in einer Box dargestellt.
    Das ist nicht mein eigentliches Ziel, sondern nur eine Kontrolle der richtigen Erfassung.

    Jetzt sollen aber nur die drei Schlüssel in den eckigen Klammern "abgefragt" werden (also C2, A4 und G1) und daraufhin die zugehörigen Werte aus der Ini-Datei erfasst und mit "Send" weggeschickt werden (z.B. RMZ).
    Die Schlüssel ändern sich ständig, es sind aber stets nur drei.

    In der Ini-Datei (C:\Werte.ini) sind die Schlüssel A1-A5, B1-B5, C1-C5 etc. mit den zugehörigen Werten abgelegt:
    A1 = W
    A2 = 1
    A3 = B
    A4 = M
    A5 = 4
    B1 = U
    B2 = Z
    B3 = K
    B4 = 3
    B5 = L
    etc.
    Diese Tabelle geht bis H5.

    Mit der Abfrage
    $sIniFile = "C:\Werte.ini"
    $sA1 = IniRead($sIniFile, "tabelle", "B1", "kein Wert vorhanden")
    bekomme ich dann in der Box bspw. den entsprechenden Wert zu dem Schlüssel B1 (also U).
    MsgBox(0, "Ergebnis", $sA1)
    Das klappt ja soweit.

    Statt "B1" (fixer Wert) sollen da aber jetzt die drei abgefragten Schlüssel stehen (z.B. C2 A4 G1) und die jeweiligen Werte (z.B. RMZ) aus der Ini per "Send" rausgehen.

    2 Mal editiert, zuletzt von Alex083 (18. März 2014 um 20:12)

  • BugFix :
    Wegen Zeitmangel erst gestern probiert, Dein Script gibt sogar ohne den genauen Wortlaut vor und nach den Klammern die drei Schlüssel richtig aus. :)

    Beispiel ist eine Messagebox mit dem Inhalt "nenne [A1] [B2] [C3] blabla":


    $sText = WinGetText("Test", "")
    $aMatch = StringRegExp($sText, "\[([^\]]+)", 3)


    For $i = 0 To UBound($aMatch) -1
    ConsoleWrite('Match Nr.' & $i+1 & ': ' & $aMatch[$i] & @LF)
    Next


    Ausgabe:

    Match Nr.1: A1
    Match Nr.2: B2
    Match Nr.3: C3


    Vielen Dank dafür, hätte ich nie geschafft!
    Wie muss ich jetzt aber nach "Next" weitermachen, um diese drei Werte weiter verarbeiten zu können?
    Der Schlüssel von Match Nr.1: (also in diesem Fall A1) soll durch die Ini-Datei "C.\Werte.ini"
    dem Wert A1 = W zugeordnet werden und somit ein "W" ausgeben.
    Das Gleiche dann für Match Nr.2 und Nr.3.

    Eigentlich bin ich dank Eurer Hilfe fast am Ziel, es fehlen wohl nur noch 2-3 Zeilen, aber ich kann das momentan einfach nicht alleine schaffen.
    Falls sich jemand erbarmen könnte, wäre ich echt unendlich dankbar! ;(

  • Soll er jetzt in/aus die/der Ini-Datei lesen oder schreiben?

    Hier mal ein Beispiel zum Lesen:

    [autoit]

    Local $avOutput[UBound($aMatch)]
    For $i = 0 To UBound($aMatch) -1
    ConsoleWrite('Match Nr.' & $i+1 & ': ' & $aMatch[$i] & @LF)
    $avOutput[$i]=IniRead('C:\Werte.ini', 'irgendeine Sektion', $aMatch[$i], '__ERROR__')
    Next

    [/autoit]

    (nicht getestet)

  • Danke, klappt aber leider nicht. Zu den drei Schlüsseln in der ersten Messagebox sollen aus der ini-Datei (Sektion: [tabelle]) die dazu gehörigen Werte ausgelesen werden und zur Kontrolle in eine neue Messagebox geschrieben werden.

    Erstes Script:

    MsgBox(0, "Test", "nenne [A1] [B2] [C3] blabla", 0)


    Zweites Script:

    $sIniFile = "C:\Werte.ini"
    $sText = WinGetText("Test", "")
    $aMatch = StringRegExp($sText, "\[([^\]]+)", 3)

    Local $avOutput[UBound($aMatch)]

    For $i = 0 To UBound($aMatch) -1
    ConsoleWrite('Match Nr.' & $i+1 & ': ' & $aMatch[$i] & @LF)
    $avOutput[$i] = IniRead("C:\Werte.ini", "tabelle", $aMatch[$i], '__ERROR__')
    Next


    --> Ausgabe in der Konsole:

    >"C:\Programme\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\LPR\script3-Klammern.au3"
    Match Nr.1: A1
    Match Nr.2: B2
    Match Nr.3: C3
    >Exit code: 0 Time: 0.307

    Einmal editiert, zuletzt von Alex083 (27. März 2014 um 20:34)

  • Du musst natürlich das Array $avOutput auch irgendwie auswerten, z.B. Array.au3 inkludieren und dann mit _ArrayDisplay die Werte anzeigen oder in der For-Schleife $avOutput[$i] in einer MsgBox o.ä. anzeigen lassen.
    Und bitte schreib AutoIt-Quellcodes das nächste Mal auch in AutoIt-Quellcode-"Tags".

  • Du musst natürlich das Array $avOutput auch irgendwie auswerten, z.B. Array.au3 inkludieren und dann mit _ArrayDisplay die Werte anzeigen oder in der For-Schleife $avOutput[$i] in einer MsgBox o.ä. anzeigen lassen.

    Danke!
    Mit Arrays bin ich absolut überfordert, keinen blassen Schimmer. Muss ich mich erst einlesen ...

    Und bitte schreib AutoIt-Quellcodes das nächste Mal auch in AutoIt-Quellcode-"Tags".

    Sorry, mache ich!