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

    über mich...

    ich habe meine Erfahrungen hauptsächlich gesammelt in (grobe Übersicht):

    - RibbonBar Automation
    - MySQL Nutzung
    - GUIs in vielerlei Ausprägung
    - Nutzung von Powershell / Batch in AutoIt
    - Windows Automatisierung

    außerhalb von AutoIt:

    - Sprachen: PS, Batch, php, html(5), javascript, (perl eingeschränkt), vbs
    - Powershell (AD, WPF inkl. Multi-Threading, ...)
    - Deployment-Automatisierung ohne SCCM
    - Office-Nutzung mit COM-Object (AutoIt, PowerShell)
    - ActiveDirectory und alles was damit zusammenhängt
    - Hyper-V Clustering (Converged / Hyper Converged)
    - Serverhardware (Konfiguration, Aufbau, Architektur, Betrieb)

    Lieblingsthema:

    günstige Automatisierung von Vorgängen, für die andere Firmen viel Geld nehmen

    more to come ...