CMD/DOS Ausgabe eines Programms in GUI ausgeben/anzeigen?

  • Hey Leute,

    habe mich die letzten paar Tage ein wenig eingelesen in AutoIT. Natürlich sind bislang echt nur grobe Grundkenntnisse vorhanden, welche mich direkt vor eine Herausforderung stellen, die ich nicht weiß zu lösen.

    Ich habe 2 EXE-Programme die in einem DOS Fenster sich öffnen und dort alle Informationen ausgeben. Diese Infos würde ich gern abfangen und in einer GUI gesammelt anzeigen lassen. Die 2 Programme sollen zudem dann nur im Hintergrund laufen. Wie man diese dann per Funktion killt wäre auch nicht schlecht zu wissen :P

    Irgendwie geht das ja bestimmt mit "StdoutRead". Nur wie genau? :/

    LG Squizzy

  • Wenn du etwas bestimmtes nicht verstehst, oder was nicht klappt, schreib mir ne PN ;) schreibe auch grad eine GUI für ne Konsolenanwendung und die Ausgabe im GUI klappt super ;)
    Vor allem das Programm starten fand ich am Anfang etwas kompliziert, läuft aber jetzt auch ;) schreib mir mal ne PN für welche Programme du das möchtest, bitte :)

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Ja vielen Dank ihr beiden!

    Joriktos

    Habe dir eine PN geschrieben! Danke für das Angebot.

    Werde mich heute abend dann auch nochmal selbst dran begeben. Leider waren die Dinge in der SUFU nicht so hilfreich. In den Ausgaben blieben die Felder immer leer :(

    LG

  • also irgendwie tut es das alles nicht so wie ich will.

    kann es ja nochmal detailierter beschreiben.

    ich habe 2 EXE Dateien welche wenn sie gestartet sind, aussehen wie DOS Fenster bzw. welche sind. Kann es sein, dass nicht alle Programme die ihre Ausgabe im DOS fenster anzeigen für StdoutRead geeignet sind?

    Die Exe Dateien erstellen .log dateien, in welchen der gleiche inhalt bei jedem start reingeschrieben werden. wäre es einfacher diese datei einfach in eine TextBox in einer shcleife schreiben zu lassen und die programme einfach unsichtbar zu machen?

    Ich könnte auch einfach mal eine ZIP hochladen mit allen wichtigen daten. Vielleicht ist jmd so nett und kann mir eine Funktion schreiben, die funktioniert. bei mir haben keine möglichkeiten bislang geklappt :/

    EDIT: Hab jz mal versucht die Textdatei einlesen zu lassen. mit dem code passiert auch einfach nichts.

    [autoit]


    #include <GUIConstants.au3>
    #include <File.au3>
    #include <constants.au3>

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

    local $datei, $zeile, $get, $zeilenAnzahl, $readZeile
    $zeile = 0
    $zeilenAnzahl = 2 ;==> Testweise
    $gui = GUICreate("console stuff")
    $edit = GUICtrlCreateEdit("", 10, 10, 300, 300)
    GUISetState()
    ;$run = Run(@ComSpec & " /c authserver.exe", @ScriptDir, @SW_SHOW)

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

    _Auslesen()

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

    while 1
    $get = GUIGetMsg()
    If $get = -3 Then
    ExitLoop
    EndIf
    WEnd

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

    Func _Auslesen()
    while 1
    $datei = FileOpen(@ScriptDir & "\logs\Auth.log", 0)
    ;$zeilenAnzahl = _FileCountLines($datei)
    Sleep(200)
    If $zeile >= $zeilenAnzahl Then
    ExitLoop
    Else
    $readZeile = FileReadLine($datei, 1)
    If $zeile = "" Then
    ExitLoop
    EndIf
    Sleep(800)
    GUICtrlSetData($edit, $edit & $readZeile)
    ;GUISetState()
    $zeile = $zeile + 1
    EndIf
    FileClose($datei)
    WEnd
    EndFunc

    [/autoit]

    LG
    Squizzy

    Einmal editiert, zuletzt von Squizzy (5. Februar 2013 um 18:13)

  • das Killen des Programms kannstu du so machen :

    [autoit]

    $iPID = Run("test.exe")
    ProcessClose($iPID)

    [/autoit]

    Zum anderen, hab ich grad nix zum Testen da.
    Aber wichtig ist , dass du die prozesse mit Run in deinem Skript als Child startest (guck dir die Hilfe zu

    [autoit]

    StdOutRead

    [/autoit]


    an)

    Edit bezüglich deinem Edit :

    [autoit]

    $readZeile = FileReadLine($datei, 1)

    [/autoit]


    Warum liest du immer Zeile 1 aus ?

  • ok ich probier es so auch nochmal :/

    kannst du dir vlt das script darüber mal angucken?

    wieso passiert da auch nix -.-

  • die erste Zeile ist Zeile 1.
    Du hast Zeile 0 stehen.
    In Zeile 31 soltest du $readZeile vergleichen
    und in Zeile 35

    [autoit]

    GUICtrlSetData($edit, GUICtrlRead($edit) & $readZeile)

    [/autoit]


    benutzen

  • ohja. doch nochmal einige fehlerchen entdeckt.

    aber die variable $zeile ist nur der Zeiger auf der aktuellen zeile. hab den trotzdem mal auf 1 gesetzt ;)


    die ausgabe tut es wenn ich der Zeilenanzahl einen festen wert zuweise.

    was jz keine wert zurückgibt ist die zeile

    [autoit]

    $zeilenAnzahl = _FileCountLines($datei)

    [/autoit]
  • du soltlest den @error überprüfen !
    Wenn du dir die Funktion aus der UDF mal angukcst, wirst du merken, dass da am Anfang ein FileOpen steht...

    oh backe :D dass muss man auch erstmal wissen ^^ ja hab das fileopen raus. und tada es funktioniert. danke dir :)

    Nun ja, ich will dich nicht abhalten das über die log Dateien zu lösen. Allerdings habe ich hier auch ein Beispiel (hast du meine PN's nicht gelesen :o?) wie man das über StdoutRead abfangen kann.

    ah :) hast ne antwort. also die Exe die ich ausführen möchte ist nicht von mir. wenn ich ich sie mit RUN aufrufe mit dem CHILD parameter und aus spass SW_SHOW lasse, dann passiert in dem kommandofenster gar nix.

    hab mal die dateien als RAR hochgeladen! >>DOWNLOAD<<
    sollte sich bei euch direkt schließen, weil ein error ganz kurz wegen nicht vorhandenem mysql server auftaucht. aber selbst das könnt ihr ja abfangen wenn ihr wisst wie ?!
    ihr rockt! :rock:

  • also an mir kann es nicht liegen.

    der output für alles andere funktioniert. zb Ping oder ipconfig. nur leider nicht für mein programm :/