Problem mit einer For...To...Step-Schleife

  • Haltet mich für doof, aber irgenwie krieg ich das gerade nicht gepeilt....

    Ich habe einen Button, der ein telnet-Fenster öffnet und eine Exe auf einem externen Gerät ausführt.

    Dieser Befehl soll nur ein einziges Mal ausgeführt werden, auch wenn gerade keine Telnet-Verbindung möglich sein sollte.
    In diesem Fall würde nämlich die telnet-Verbindung sehr oft hintereinander ausgeführt und der Zugriff auf das Programm nicht mehr möglich.
    Als hab ich mir das so gedacht, dass ich eine For...To...Step-schleife einbaue, die lediglich einmal ausgeführt werden soll:

    [autoit]

    Func _telnet()
    ; Run Telnet
    Local $i
    For $i = 2 To 1 Step -1
    Run("telnet " & $adress, @SystemDir, $STDIN_CHILD + $STDOUT_CHILD) ; @SW_HIDE,
    ConsoleWrite("Telnet" & $adress & @CRLF)
    WinWait("Telnet " & $adress, "", 1)
    ;======= Rename window
    $WinTitle = "Telnet connection to MIB target <<- Screenshot ->>"
    WinSetTitle("Telnet " & $adress, "", $WinTitle)
    Next
    EndFunc ;==>_telnet

    [/autoit]

    Warum geht das nicht??? Helft mir mal bitte aufs Pferd.... :wacko:
    Telnet wird am laufenden Band aufgerufen... ?(

    Gruß
    Pitter

    Einmal editiert, zuletzt von Pitter (19. Januar 2012 um 19:54)

  • Probiers mal mit einer größeren Step Zahl und/oder statt ConsoleWrite Send.

    MFG,

    StevenX

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Hallo,

    nein, das ist es nicht. Das ConsoleWrite() ist noch ein Überbleibsel, um die Übergabe zu kontrollieren.

    Jetzt hab ich mir mal eine MsgBox ausgeben lassen mit $i... öhm... Die wird runter gezählt, aber bekommt immer wieder den Startwert?!? Hä???

    Gruß
    Pitter

  • Ich weiß noch, wie ich früher mit ConsoleWrite experimentiert habe (ich habe immer wieder Phasen, wo ich eine bestimmte Funktion so gut wie möglich ausprobieren will). Jedenfalls, ich scheiterte damals kläglich :(. Laut der AutoIt Konsole wird Telnet aber ausgeführt...

    MFG,

    StevenX

    [Blockierte Grafik: http://stefan.blagojevic.at/loading.gif]

    Design, Modellbau, CAD <3
    AutoCAD, ArchiCAD, REVIT (ist ein Scheiss, habe aber das Zertifikat)

    Cinema 4D, RuckZuck Statik Programm

    Michael Bay als Architekt


    Da eine Glasfassade! Booom Sichtbeton! Laminiertes Bild auf Mosaiksteinchen! Granit! Granit! Granit! Sichtbetonwand mit 50° Neigung!
    Holzverkleidung erscheint da! Boooooom!

  • Klar... Telnet wird ausgeführt, schliesst aber das Fenster sofort nach dem Umbenennen wieder... mangels fehlendem externen Gerät.

    aber was mich wundert ist, wo kommt das her, dass $i immer wieder auf den Startwert geht. Vom Button kann es nicht kommen, der wird nur ein mal geklickt.... bin gerade zu doof dafür, das zu verstehen. :(

    Gruß
    Pitter

  • Warum bitte nutzt du ne For ?
    Die macht doch in deinem Script gar nichts, ausser das ganze 2 ma durchzugehen ...
    For-Schleifen sind eigentlich wegen ihrem Index so praktisch, für Arrays usw ...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Jetzt hab ich mir mal eine MsgBox ausgeben lassen mit $i... öhm... Die wird runter gezählt, aber bekommt immer wieder den Startwert?!? Hä???


    Dann scheinst du die func _telnet aus einer Schleife heraus auf zu rufen, aber auch deine Schleife würde Telnet 2 * aufrufen,

    mfg autoBert

  • hmmm...

    wie würdet Ihr das denn machen, dass die max. 2x aufgerufen wird?

    Hier ist noch der Button, der die _telnet() aufruft:

    [autoit]

    Case $screenButton ;====== Take Screenshot ======
    ;===== call func _screen_dateset to get new timestamp
    _screen_dateset()
    ;===== open Telnet to connect to target
    _telnet()
    ;===== call func _screenshot to take screenshot
    _screenshot()
    ;===== main structure to take screenshot
    While WinExists($WinTitle, "")
    If WinActive($WinTitle, "") Then
    HotKeySet("{F10}", "_screenshot")
    Else
    HotKeySet("{F10}")
    EndIf
    Sleep(20)
    WEnd

    [/autoit]

    Gruß
    Pitter

  • wie bereits geschrieben in den beiden Skriptteilen ist kein Fehler, dein SKript müsste laufen. Zu Testzwecken habe ich ConsoleWrite-Zeilen eingefügt:

    'Screenbuttn&quot;
    [autoit]

    Case $screenButton ;====== Take Screenshot ======
    ;===== call func _screen_dateset to get new timestamp
    _screen_dateset()
    ;===== open Telnet to connect to target
    ConsoleWrite("Screenbutton vor TELNET" & @CRLF)
    _telnet()
    ConsoleWrite("Screenbutton nach TELNET" & @CRLF)
    ;===== call func _screenshot to take screenshot
    _screenshot()
    ;===== main structure to take screenshot
    While WinExists($WinTitle, "")
    If WinActive($WinTitle, "") Then
    HotKeySet("{F10}", "_screenshot")
    Else
    ExitLoop
    HotKeySet("{F10}")
    EndIf
    Sleep(20)
    WEnd

    [/autoit]
    _telnet
    [autoit]

    Func _telnet()
    ; Run Telnet
    ConsoleWrite("TELNET Enter" & @CRLF)
    Run("telnet " & $adress, @SystemDir, $STDIN_CHILD + $STDOUT_CHILD) ; @SW_HIDE,
    WinWait("Telnet " & $adress, "", 1)

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

    ;======= Rename window
    $WinTitle = "Telnet connection to MIB target <<- Screenshot ->>"
    WinSetTitle("Telnet " & $adress, "", $WinTitle)
    ConsoleWrite("TELNET Exit" & @CRLF)
    EndFunc ;==>_telnet

    [/autoit]

    Laut meiner Konslenausgabe:

    Code
    Screenbutton vor TELNET
    TELNET Enter
    TELNET Exit
    Screenbutton nach TELNET

    ist alles in Ordnung als nur 1 Aufruf der func _telnet,

    mfg autoBert

  • ...eben...

    das Problem besteht auch nur dann, wenn ich keine physische Verbindung zu dem externen Gerät habe.
    Dann wird die _telnet() in einer Endlos-Schleife ausgeführt.
    Als Exe kompiliert kann ich dann den Task nur noch abschiessen... Ich hab da jedenfalls keine Idee mehr zu.

    Ist die physische Verbindung zum Gerät hergestellt, wird die _telnet() und auch die _screenshot() nur einmal ausgelöst.

    Jetzt wäre nur noch die Frage, wie ich die fehlerhafte Verbindung abarbeite, denn so kann es ja nicht bleiben. Schliesslich kann das immer mal passieren, dass man vergessen hat die D-Link-Adapter an den PC anzuschliessen....

    Gruß
    Pitter

  • Moin, also so wie ich dass sehe Prüfst du auch nicht ob das Gerät erreichbar ist, sind Tellnet Geräte nicht auch über eine IP zu erreichen? wenn ja Prüfe doch erst ob das Gerät erreichbar ist wenn ja > weiter wenn nicht gib einen Error aus.
    Sollte dass gerät nicht über einen Ping zb geprüft werden kannst du auch einen Timer setzen zb > Telnet initiate > warte 5 Sec > wenn nichts passiert > Error , andernfalls Verbindung aufgebaut.

    Gruß Marvin

  • Passt perfekt...

    geht der Ping nicht durch, kann ich nur durch einen weiteren Klick dann die Verbindung erneut anstossen....

    Vielen Dank für Eure Hilfe

    Gruß
    Pitter

    Gruß
    Pitter