Probleme bei der Ausgabe: Subscript used with non-Array variable

  • Hallo,

    ich habe ein Problem bei einer Ausgabe einer Variablen.
    Anbei das Skript:

    [autoit]

    #include<Array.au3>
    #include<String.au3>

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

    ;##Global $mailtxt, $mailheader, $betreff, $name, $vorname, $nachname, $quelltext, $bg, $ci

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

    HotKeySet("{ESC}", "Terminate")

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

    #Region --- Au3Recorder generated code Start ---

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

    ;##### MAIL RIPPEN #####
    Opt("WinTitleMatchMode", 2)
    WinActivate("- Nachricht")
    Send("{CTRLDOWN}ac{CTRLUP}")
    Sleep(500)
    $mailtxt = ClipGet()
    Sleep(500)
    Send("{ALTDOWN}7z{ALTUP}")

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

    _WinWaitActivate("Nachrichtenoptionen", "")
    Send("{ALTDOWN}z{ALTUP}{CTRLDOWN}c{CTRLUP}{ENTER}")

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

    $mailheader = ClipGet()

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

    $betreff = _StringBetween($mailheader, "Subject: ",@CRLF)

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

    $name = _StringBetween($mailheader, 'From: "','" <')

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

    ;##### Prepare for IM #####
    Send("{SHIFTDOWN}{TAB}{SHIFTUP}"); In Betreffzeile springen für spätere IM Nummer

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

    ;##### Mail speichern #####
    Send("{ALTDOWN}du{ALTUP}")
    _WinWaitActivate("Speichern unter","")
    Send("{ALTDOWN}t{ALTUP}Outlook-Nachrichtenformat{ENTER}{ALTDOWN}s{ALTUP}")

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

    Sleep(500)

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

    _WinWaitActivate("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","")

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

    ;##### Mail speichern #####

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

    MouseClick("left",787,226,1)
    MouseClick("right",773,371,1)
    MouseClick("left",801,422,1)
    _WinWaitActivate("Öffnen","")
    Send("{SHIFTDOWN}{TAB}{SHIFTUP}{UP}{ENTER}")
    MouseClick("left",358,230,1)

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

    ;##### BETREFF EINFÜGEN #####
    MouseClick("left",682,200,1)
    Send("{CTRLDOWN}a{CTRLUP}")
    ClipPut($betreff[0])
    Send("{CTRLDOWN}v{CTRLUP}")

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

    ;##### SORT NAME #####
    $vorname = _StringBetween($name[0], ", ", "") ;Vorname aus String ausschneiden
    _ArrayToClip($vorname)
    MouseClick("left",957,326,1)
    Send("{CTRLDOWN}av{CTRLUP}")
    Sleep(500)

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

    $nachname = _StringBetween($name[0], "", ",") ;Nachname aus String ausschneiden
    _ArrayToClip($nachname)
    MouseClick("left",957,304,1)
    Send("{CTRLDOWN}av{CTRLUP}{ENTER}") ;Einfügen und FILL

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

    ;################ Warten falls User nicht eindeutig ######################
    _WinWaitActivate("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","")

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

    Sleep(2000)

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

    ;#### BG und CI rippen und einfügen ####
    opt("WinTitleMatchMode", 2)
    WinActivate("xxxxxxxxxxxxxx")

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

    ;##### BG RIPPEN #####
    Send("{CTRLDOWN}u{CTRLUP}") ;Quelltext aufrufen
    Sleep(1000)
    Send("{CTRLDOWN}ac{CTRLUP}") ;Quelltext kopieren
    $quelltext = ClipGet()
    Sleep(1000)
    Send("{CTRLDOWN}w{CTRLUP}") ;Quelltext schließen

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

    $bg = _StringBetween($quelltext, "- GV "," -") ;BG aus Quelltext schneiden
    Sleep(1000)

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

    $ci = _StringBetween($quelltext, "Configuration Item:</b></i><td>","</td>") ;CI aus Quelltext schneiden
    Sleep(1000)

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

    _WinWaitActivate("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","")

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

    ;#### BG einfügen ####
    MouseClick("left",561,327,1);bg
    Send("{CTRLDOWN}a{CTRLUP}")
    ClipPut($bg[0])
    Send("BG")
    Send("{CTRLDOWN}v{CTRLUP}")
    sleep(1000)

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

    ;#### Reiter CI wechseln
    MouseClick("left",439,229,1);CI REITER

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

    ;#### CI einfügen ####
    MouseClick("left",589,278,1);ci
    ClipPut($ci[0])
    Send("{CTRLDOWN}av{CTRLUP}")
    Sleep(1000)

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

    MouseClick("left",365,228,1);INTERACTION DETAIL REITER

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

    ;#### Criticality anpassen
    MouseClick("left",596,458,1)
    Send("{CTRLDOWN}ac{CTRLUP}")
    MouseClick("left",570,433,1)
    Send("{CTRLDOWN}av{CTRLUP}")

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

    ;#### Notified by email
    MouseClick("left",596,590,2)
    Send("{SHIFTDOWN}e{SHIFTUP}") ;Einfügen

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

    ;#### Mailtext einfügen ####
    MouseClick("left",453,732,1)
    ClipPut($mailtxt)
    Send("{CTRLDOWN}a{CTRLUP}---> mail attached{ENTER}{ENTER}{CTRLDOWN}v{CTRLUP}") ;Einfügen

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

    opt("WinTitleMatchMode", 2)
    WinActivate("- Nachricht")

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

    #Region --- Internal functions Au3Recorder Start ---
    Func _WinWaitActivate($title, $text, $timeout = 0)
    WinWait($title, $text, $timeout)
    If Not WinActive($title, $text) Then WinActivate($title, $text)
    WinWaitActive($title, $text, $timeout)
    EndFunc ;==>_WinWaitActivate
    #EndRegion --- Internal functions Au3Recorder Start ---

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

    #EndRegion --- Au3Recorder generated code Start ---

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

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

    [/autoit]


    Es erscheint die Fehlermeldung:


    [autoit]

    (101) : ==> Subscript used with non-Array variable.:
    ClipPut($bg[0])
    ClipPut($bg^ ERROR

    [/autoit]


    Wenn ich es aber so laufen lasse funktioniert es.

    [autoit]

    #include<Array.au3>
    #include<String.au3>

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

    HotKeySet("{ESC}", "Terminate")

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

    #Region --- Au3Recorder generated code Start ---

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

    ;#### BG und CI rippen und einfügen ####
    opt("WinTitleMatchMode", 2)
    WinActivate("xxxxxxxx")

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

    ;##### BG RIPPEN #####
    Send("{CTRLDOWN}u{CTRLUP}") ;Quelltext aufrufen
    Sleep(1000)
    Send("{CTRLDOWN}ac{CTRLUP}") ;Quelltext kopieren
    $quelltext = ClipGet()
    Sleep(1000)
    Send("{CTRLDOWN}w{CTRLUP}") ;Quelltext schließen

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

    $bg = _StringBetween($quelltext, "- GV "," -")
    Sleep(500)
    $ci = _StringBetween($quelltext, "Configuration Item:</b></i><td>","</td>")
    Sleep(500)

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

    _WinWaitActivate("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","")

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

    ;#### BG einfügen ####
    MouseClick("left",561,327,1);bg
    Send("{CTRLDOWN}a{CTRLUP}")
    ClipPut($bg[0])
    Send("BG")
    Send("{CTRLDOWN}v{CTRLUP}{ENTER}")
    sleep(1000)

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

    ;#### Reiter CI wechseln
    MouseClick("left",439,229,1);CI REITER

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

    ;#### CI einfügen ####
    MouseClick("left",589,278,1);ci
    ClipPut($ci[0])
    Send("{CTRLDOWN}av{CTRLUP}{ENTER}")
    Sleep(1000)

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

    MouseClick("left",365,228,1);INTERACTION DETAIL REITER

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

    ;#### Criticality anpassen
    MouseClick("left",596,458,1)
    Send("{CTRLDOWN}ac{CTRLUP}")
    MouseClick("left",570,433,1)
    Send("{CTRLDOWN}av{CTRLUP}")

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

    ;#### Notified by email
    MouseClick("left",596,590,2)
    Send("{SHIFTDOWN}e{SHIFTUP}") ;Einfügen

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

    #Region --- Internal functions Au3Recorder Start ---
    Func _WinWaitActivate($title, $text, $timeout = 0)
    WinWait($title, $text, $timeout)
    If Not WinActive($title, $text) Then WinActivate($title, $text)
    WinWaitActive($title, $text, $timeout)
    EndFunc ;==>_WinWaitActivate
    #EndRegion --- Internal functions Au3Recorder Start ---

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

    #EndRegion --- Au3Recorder generated code Start ---

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

    Func Terminate()
    Exit 0
    EndFunc ;==>Terminate

    [/autoit]


    Ich komm da nicht weiter, weil ich nicht verstehe warum es in einem Skript funktioniert, und in einem anderen wiederum nicht.


    Vielen Dank im Voraus.

    Einmal editiert, zuletzt von SubSeven (26. März 2012 um 15:21)

  • sehr komisch, also ich bekomme deine Fehlermeldung nicht

    (101) : ==> Subscript used with non-Array variable.:
    ClipPut($bg[0])
    ClipPut($bg^ ERROR

    Die Fehlermeldung bezieht sich ja auf Zeile 101
    ClipPut($bg[0])

    In Zeile 101 möchtest du den ersten Eintrag [0] eines Array haben vom Ergebnis aus Zeile 90 haben.
    Du hast aber in Zeile 90 gar kein Array erzeugt.


    Aber änder mal Zeile 90 wie folgt ab und test nochmal

    [autoit]

    $bg = _StringBetween($quelltext, "- GV "," -",3) ;BG aus Quelltext schneiden

    [/autoit]
  • Also ich würde an deiner Stelle komplett auf send und mouseclick verzichten. Das ist viel zu unzuverlässig.

    Da du leider nicht geschrieben hast was dein Script genau tun soll und welches Programm du hier zu automatisieren versuchst (ok irgendwo sieht man outlook, aber keine Version...) kann man nur erkennen, dass es wohl um Emails geht. Was genau passieren soll wurde mir beim überfliegen nicht klar.

    Wie dem auch sei es gibt viel bessere Methoden um mit Emails zu arbeiten. Zum einen kann man die Emails direkt per autoit abrufen und versenden wenn man die richtige UDF nutzt, zum anderen kann man externe Programme auch mit den control Funktionen steuern (z.B. controlclick, controlcommand, controlsend, controlgettext usw.). Letzteres liefert in jedem Fall verlässlichere Ergebnisse als irgendwelche Tastenkombinationen die womöglich nichtmal im richtigen Fenster landen. Grundsätzlich solltest du vielleicht auch mehr debugging betreiben, wie oben schon durch das Beispiel von letsgo angedeutet. Bei Funktionen die Arrays zurückgeben schadet es auch nicht sich den Inhalt des Arrays mit _arraydisplay ausgeben zu lassen, dann wird oftmals auch klar warum die nachfolgenden Funktionen nichts mehr mit dem Array anfangen können, sofern es denn überhaupt eins geworden ist. Deine Fehlermeldung besagt jedenfalls, dass es in diesem Fall keines war.

  • Hi,
    danmke schonmal für Euren Einsatz :)
    Das Skript habe ich bis jetzt nur in SciTE (F5) laufen lassen.

    Also eine Fehlermeldung kommt da nicht, also schein es ein Array zu sein :D
    Auch ohne ,3 hinten dran in Zeile 90


    Auch mit der 3 hinten dran bekomme ich die Fehlermeldung 'Subscript used with non-Array variable'.

    Aber was soll das für ein E-Mail-Programm sein auf welches das Script da in Zeile 11 wartet ?
    WinActivate("BG 3.0 RC3")


    Es handelt sich dabei um Firefox, das ist der Titel einer Webpage.
    Es werden Teile des HTML-Quelltextes kopiert.

    [autoit]

    if Not IsArray($bg) or @error then MsgBox(0,'ERROR','Fehlercode:'&@error)

    [/autoit]


    Hierbekomme ich die Ausgabe:
    ERROR
    Fehlercode:0

    misterspeed
    Auf mouseclick kann ich leider nicht verzichten, obwohl mich die Unzuverlässlichkeit fast schon in den Wahnsinn getrieben hat.

    Das Skript kopiert bestimmte Informationen aus einer E-Mail und einem HTML-Quelltext (Firefox), und fügt diese in ein Formular ein.
    Funktioniert soweit alles, nur an der einen Stelle klappt die Ausgabe nicht, wenn ich es im Gesammtskript laufen lasse. Das Teilskript funktioniert komischerweise, obwohl ich den Code 1:1 übernommen habe. Das verstehe ich nicht. ?(

    Vielen dank :)

  • misterspeed
    Auf mouseclick kann ich leider nicht verzichten, obwohl mich die Unzuverlässlichkeit fast schon in den Wahnsinn getrieben hat.

    Das Skript kopiert bestimmte Informationen aus einer E-Mail und einem HTML-Quelltext (Firefox), und fügt diese in ein Formular ein.

    Schonmal was von der ff.au3 gehört? Gibts hier sogar einen kompletten Forenbereich dafür: https://autoit.de/index.php?page=Board&amp;boardID=32

  • Danke für Eure Hilfe :)

    Durch die Rumprobiererei bin ich der Sache auf die Schliche gekommen!
    Ansich ist das Skript richtig.

    Der Knackpunkt waren die Zeilen 85, 86.

    [autoit]

    Send("{CTRLDOWN}ac{CTRLUP}") ;Quelltext kopieren
    Sleep(1000); Rechner zu langsam :/
    $quelltext = ClipGet()

    [/autoit]

    Es fehlte ein Sleep(1000).
    Anscheinend ist mein Rechner zu lahm um den Text schnell genug in die Zwischenablage zu kopieren.