Concatenates Operator und Anderes

  • Hi Leute,

    sorry für den blöden Titel, mir ist wirklich keine bessere Beschreibung eingefallen. Auch ist mir die Frage mega-peinlich, aber ich beschäftige mich erst seit Kurzem mit Autoit (eigentlich um Zeit zu sparen), aber ich komme an gewissen Stellen einfach nicht weiter:

    a.)
    Ich habe versucht, mit Hilfe des Concatenate Operators, mehrere Variablen auf die Schnelle zu erstellen, wie in den meisten anderen Sprachen durchaus üblich. Aber es ist mir einfach nicht gelungen, so dass ich gezwungen war, mit einem Array zu arbeiten, was ich eigentlich vermeiden wollte. Trotzdem möchte ich gerne wissen, was ich falsch gemacht habe.

    Wieso klappt zum Beispiel folgendes nicht:

    Code
    ;fail 1For $i = 0 To 9	Local $oBody & $i
    	Next
    ;fail 2For $i = 0 To 9	Local $oBody$i
    	Next
    ;fail 3For $i = 0 To 9	Local $oBody & Number($i)
    	Next



    Das ist jetzt nur ein Beispiel, aber wie kann ich eine Variable in einer Schleife durch zwei Variablen erstellen?


    b.)
    Collections und der "." Operator. In der Hilfe Finde ich einfach nichts dazu. Beispiel:

    Code
    Local $oInputs = _IETagNameGetCollection($oIE, "input")
    Local $sTxt = ""
    For $oInput In $oInputs
        $sTxt &= $oInput.type & @CRLF
    Next
    MsgBox($MB_SYSTEMMODAL, "Form Input Type", "Form: " & $oInput.form.name & @CRLF & @CRLF & "         Types :" & @CRLF & $sTxt)


    Wer ein bisschen HTML kann, versteht schon den Sinn von type, form und name. Aber ich möchte es gerne richtig verstehen. So gibt es zum Beispiel bei _IELinkGetCollection logischer Weise $variable.href, aber wie muss ich mir das vorstellen und wo stehen alle Werte. Muss ich mir das so vorstellen, dass die Werte der unterschiedlichen "Tags" in ein Array gelesen werden und dass man dann mit $Variable.TAG die entsprechenden Tags auslesen kann?

    Einmal editiert, zuletzt von Turin (25. Februar 2014 um 22:36)

    • Offizieller Beitrag

    zu a)
    Das ist in AutoIt in der Form nicht möglich.
    Du könntest alternativ Folgendes anwenden:

    [autoit]

    For $i = 1 To 10
    Assign('Var_' & $i, $i)
    Next
    ConsoleWrite(Eval('Var_5') & @LF)

    [/autoit]

    Aber zum Einen ist Assign/Eval als schlechter Stil verpönt und zum Anderen generieren derartig erstellte Variablen einen Error bei der Syntaxprüfung, da sie erst zur Laufzeit existieren. Du könntest sie also nur mit Eval ansprechen.
    Und warum willst du Arrays vermeiden? Berührungsängste? Das legt sich spätestens dann, wenn du merkst, wie sehr du dir die Arbeit im Skript damit vereinfachen kannst.

    zu b)
    AutoIt kann mit einigen Objekten umgehen. Dazu gehört auch dein Bsp. Internet Explorer.
    Und somit ist der Punkt das übliche Trennsymbol zu den Methoden und Eigenschaften dieses Objektes. Eine Übersicht darüber kannst du dir bei MSDN suchen.

  • Zu a)

    • Nimm Abstand davon Variablennamen dynamisch vergeben zu wollen.
    • Nimm stattdessen ein Array
    • Obwohl du es sowieso nicht machst schadet es auch nicht zu wissen wie es prinzipiell geht: Mit Assign()


    Zu b)
    Das sind Objekte.
    Objekte haben Daten welche über einen Namen angesprochen werden könne (das hinter dem Punkt).
    Ebenso können sie auch Funktionen ausführen.
    Obwohl ich mich mit den IE-Funktionen nicht auskenne behaupte ich mal, dass _IETagNameGetCollection() eine Liste von DOM-Elementen zurückgibt.
    Die HTML-Atttribute dieser Elemente kann man dann ganz einfach mit der Schreibweise $Element.Attribut ansprechen.
    Wenn du also wissen willst welche Attribute ein Element haben kann - schau in den Quelltext der Seite.

    Edit: Tja - deutlich zu spät...

  • Vielen Dank Leute. Ich hatte es ja schon dadurch gelöst, dass ich die gleiche Variable immer wieder überschrieben habe, was zwar ging, aber etwas ungeschickt ist, weil man dann vorherige Inhalte nicht mehr überprüfen kann. Ein Array wollte ich hier vermeiden, weil es schon zwei andere gab. Eigentlich wollte ich keine 9 Variablen deklarieren, sondern in einer Schleife 9 verschiedene, fortlaufende Variablen benutzen, was ich nicht hinbekommen habe.
    Wenn ihr es genau wissen wollt:


    [autoit]

    ;Read PLZ into ArrayFor $i = 0 To 9 _IENavigate($oIE, "http://www.beispiel-webseite.de/thumbs.php?postleitzahl="&$i) $oBody = _IEBodyReadHTML($oIE) $obody = StringTrimLeft($obody, StringInStr($obody, "Benutzer") ) $obody = StringTrimRight($obody, 851) Sleep(500) ;Zusammenfügen $Body &= $oBody Next

    [/autoit]



    Anstelle von $oBody hätte ich gerne $oBody & $i, je nach Postleitzahl gehabt.

  • Wenn du mal einen solchen Beispielquelltext postest können wir dir sicherlich helfen die benötigten Informationen robuster zu ermitteln.
    851 Zeilen vom Ende eines Quellcodes abzuschneiden könnte auf Dauer zu unterschiedlichen Ergebnissen führen.
    StringInStr, _StringBetween, StringRegExp und andere wären schonmal gute Kandidaten das effektiver zu gestalten.

    Davon abgesehen würde ich sowieso statt den _IE-Funktionen mit InetRead() (In Verbindung mit BinaryToString) arbeiten um an den Quelltext zu gelangen.

    • Offizieller Beitrag

    Ich seh keinen Unterschied zwischen "9 Variablen" und "9 verschiedene, fortlaufende Variablen".
    Also Array oder Dictionary-Objekt

    Spoiler anzeigen
    [autoit]

    ;Read PLZ into Array
    $oBody = ObjCreate('Scripting.Dictionary')
    For $i = 0 To 9
    _IENavigate($oIE, "http://www.beispiel-webseite.de/thumbs.php?postleitzahl="&$i)
    $sHtml = _IEBodyReadHTML($oIE)
    $sHtml = StringTrimLeft($sHtml, StringInStr($sHtml, "Benutzer") )
    $sHtml = StringTrimRight($sHtml, 851)
    Sleep(500)
    ;Zusammenfugen
    $oBody.Add($i, $sHtml)
    Next

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

    For $i = 0 To 9
    ConsoleWrite($i & ': ' & $oBody.Item($i) & @LF)
    Next

    [/autoit]


    Wobei ich AJ zustimme - 851 Zeichen trimmen sieht sehr Fehleranfällig aus.

  • Vielen Dank nochmal euch beiden. Ja, StringTrimRight war eine Notlösung. Da habt ihr mich erwischt und das werde ich noch nachbessern. Auch ist es sicher besser mit den eingebauten Funktionen zu arbeiten, die hatte ich mir natürlich auch angesehen. Der Grund wieso ich hier _IE verwendet habe (abgesehen davon, dass ich Autoit erst seit 2 Tagen überhaupt kenne) ist, dass ich bestimmte Teile von 9 Webseiten ausschneide, und diese dann direkt mit _IEBodyWriteHTML in eine neue Webseite zurückschreibe. Dies allerdings auch nur aus Faulheit, weil ich so sehr schnell und einfach sämtliche Links mit _IELinkGetCollection in ein Array abgreifen kann. Ganz sauber kommt mir das selbst nicht vor, aber es funktioniert. Ich hatte vorher auch probiert alles in eine temporäre Datei zu schreiben und diese dann zu parsen. Auch das hat geklappt aber mit dem einlesen und parsen wurde es mir dann schnell zu kompliziert. Mit _IELinkGetCollection habe ich die Links in nur 3 Zeilen :)