DOS-Ausgabe in Echtzeit nach AutoIt umleiten

  • Ich möchte gerne wärend ein Befehl im DOS-Command abgearbeitet wird in Echtzeit die Ausgabe in ein Eingabefeld umleiten.

    Dabei bin ich auf den Befehl StderrRead gestoßen und habe folgendes versucht:

    [autoit]


    $edit_dir = GUICtrlCreateEdit("", 404, 72, 282, 334, $ES_READONLY+$WS_VSCROLL)

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

    Func _getDOSOutput($command)
    Local $text = "", $Pid = Run('"' & @ComSpec & '" /c ' & $command, "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
    $text &= StderrRead($Pid, False, False)
    If @error Then ExitLoop
    GUICtrlSetData($edit_dir, $text)
    Sleep(10)
    WEnd
    EndFunc

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

    $schreiben = "nibwrite.exe -D" & GUICtrlRead($combo_laufwerkid) & ' "' & $ordnername & _GUICtrlListView_GetItemTextString($listview_dateiliste) & '"'
    $dir = _getDOSOutput($schreiben)
    GUICtrlSetData($edit_dir, $dir)

    [/autoit]

    Allerdings bekomme ich rein gar nichts angezeigt.

    Bin ich hier am richtigen Wege oder geht das vielleicht gar nicht?

  • Ok, Console, wie auch immer sich das Teil nennt :)

    Dieses Beispiel hatte ich auch schon entdeckt, und zuvor schon StdoutRead verwendet.

    Damit bekomme ich aber nur eine Ausgabe, wenn der Befehl abgearbeitet ist.

    Liegt es vielleicht daran, dass die Zeilensprünge in der Ausgabe nicht richtig erkannt werden?

    Das beispiel alleine bringt mir auch nur eine leere msgbox.


    Kurz gebastelt:

    Code
    #include <Constants.au3>
    Local $foo = Run(@ComSpec & " /c dir C:\Windows", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
        $line = StdoutRead($foo)
        If @error Then ExitLoop
        MsgBox(0, "STDOUT gelesen:", $line)
    WEnd

    Bringt zuerst eine leere msg und nach ok das Inhaltsverzeichnis.

    Einmal editiert, zuletzt von DerSchatten (29. Juli 2011 um 22:16)

  • Das Programm läuft weiter und produziert weiterhin munter Cmd-Outputs während die msgbox angezeigt wird.
    Eine msgbox pausiert jedoch während der Anzeige das AutoIt-Skript.
    Tausch doch einfach mal den Msgbox-Befehl mit einem ConsoleWrite aus und die Ausgabe sollte "simultan" mitlaufen.

  • So?

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>

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

    Opt("GuiOnEventMode", 1)

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

    GUICreate("Consolenausgabe", 500, 500)
    GUISetOnEvent(-3, "_Exit")

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

    Global $nEdit = GUICtrlCreateEdit("", 10, 10, 480, 480)

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

    GUISetState()

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

    _ConsoleDir()

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

    While 1
    Sleep(20000)
    WEnd

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

    Func _ConsoleDir()
    Local $foo = Run(@ComSpec & " /c dir C:\Windows", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $line
    While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
    GUICtrlSetData($nEdit, GUICtrlRead($nEdit) & $line)
    WEnd
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Das funktioniert grundsätzlich, danke!

    Nur flackert die Ausgabe recht stark und sie erfolgt nicht Zeilenweise, sondern alles in einer Wurst.
    Kann ich irgendwie die Zeilensprünge abfragen? Sodass er mir danach eine neue Zeile beginnt.

  • Ich würde in dem Script von funkey die Zeile 25 durch folgendes ersetzen:

    [autoit]

    GUICtrlSetData($nEdit, $line & @CRLF, 'append')

    [/autoit]


    Dadurch macht man zwar selbst eine neue Zeile, aber wenn es nicht anders geht...