CMD mit StdoutRead komplett auslesen

  • Hallo zusammen,

    ich komme leider nicht weiter, mein Problem ist, dass ich eine bereits kompilierte .exe (CMD Window) auslesen muss.

    Leider wird nicht alles ausgelesen, lediglich bis der Updateprozess beginnt (dieser zeit den Fortschritt des Downloads an, um genau den geht es mir)

    Lediglich wenn das CMD-Window geschlossen(!) wird, wird angezeigt was in ihm gestanden hat, aber eben nicht "live". =/

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    GUICreate("Test")

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

    $ServerLog = GUICtrlCreateEdit("", 5, 5, 300 - 10, 300 - 10)

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

    GUISetState(@SW_SHOW)

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

    Local $shell = Run(@ScriptDir & "\steamcmd.exe" & " steamcmd +runscript 0_firstinstall.txt", @ScriptDir, @SW_SHOW, 0x2)
    WinWaitActive (@ScriptDir & "\steamcmd.exe" )

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

    While 1
    $line = StdoutRead($shell)
    If @error Then ExitLoop
    $EditOld = GUICtrlRead($ServerLog)
    GUICtrlSetData($ServerLog, $line & @CRLF & $EditOld)
    sleep(200)
    Wend

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Wie kann ich das Problem beheben?

    Anbei ein Screenshot der CMD Console alles im roten Frame wird ausgegeben, darunter erst nachdem die Console geschlossen wird.

    i.imgur.com/AfUyuEW.jpg

    Handelt es sich evtl um einen großen zusammenhängenden ablauf? So das

    [autoit]

    StdoutRead

    [/autoit]

    selbigen erst nach komplettierung anzeigt? (Bzw. bei Abbruch, weil der Prozess unterbrochen wird)

    Gibt es da evtl einen Workaround? Der das ganze in Zeilen splitten kann?

    Einmal editiert, zuletzt von vism (1. Dezember 2014 um 22:46)

  • Ich vermute, dass liegt daran, dass die Konsole nicht ansprechbar ist, solange diese etwas ausführt.

    Du hast dann wohl erst wieder Zugriff, wenn die Schleife im Updateprozess unterbrochen wird.

    Eine Lösung direkt habe ich aber auch nicht. Wird wohl nicht ganz einfach werden. Ich vermute, man muss dafür mit Speicher-Hooks arbeiten, um einen Break im CMD auszulösen und damit die Konsole auslesefähig zu machen.

    Einmal editiert, zuletzt von KloMeister (2. Dezember 2014 um 15:53)

  • Spoiler anzeigen

    Ich vermute, dass liegt daran, dass die Konsole nicht ansprechbar ist, solange diese etwas ausführt.

    Du hast dann wohl erst wieder Zugriff, wenn die Schleife im Updateprozess unterbrochen wird.

    Eine Lösung direkt habe ich aber auch nicht. Wird wohl nicht ganz einfach werden. Ich vermute, man muss dafür mit Speicher-Hooks arbeiten, um einen Break im CMD auszulösen und damit die Konsole auslesefähig zu machen.

    Das klingt interessant, es gibt auch leider keine Möglichkeit die steamcmd.exe mit bspw. einer debug-funktion auszustatten, die evtl. eine Art Log erstellt, welches man auslesen könnte.
    Generell reicht das Spektrum der geloggten Daten nur bis hin zu den einzelnen Servern die connected werden jedoch nicht für den eigentlichen Updateprozess (Progresstechnisch) relevant sind. =/

    Danke trotzdem für die Antwort! =)

  • Ich bin da zwar nicht so bewandert, habe aber schon erlebt, dass manche Konsolenprogramme bestimmte Ausgaben über den Error-Stream ausgebn.
    Vielleicht gibt dir der Stream was zurück ...
    StderrRead($shell)

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)