Inhalt aus noch laufender Cmd mitlesen

  • Hallo zusammen,

    ich habe folgendes Problem:

    Wir nutzen zum compilieren eines größeren Projektes einen Makeprozess, der über die DosBox läuft. Der ganze Vorgang dauert so 5-8min.
    Das starten läuft über eine Batch-Datei welche aus einem AutoIt-Script heraus aufgerufen wird..
    Während des MakeProzesses laufen jede Menge Info in der Dosbox auf.

    Gibt es nun eine Möglichkeit während des laufenden Prozesses die Box mitzulesen?

    Würde die Daten nämlich gerne in eine UserGUI übernehmen und vorher noch parsen (wg. Statistik, einfärben von Warnings etc.).

    Hab schon mit StdoutRead experimentiert. Bin da aber bisher nicht so richtig weitergekommen.

    Danke
    SuperElmo

  • Hi,

    habe es mit folgendem versucht.

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

    $foo = Run(@ComSpec & " /c Makeit.bat", @ScriptDir, @SW_SHOW , $STDERR_CHILD + $STDOUT_CHILD)

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

    While True
    $line = StdoutRead($foo)
    If @error Then ExitLoop

    $logfile = FileOpen("x:\willi.log", 9)
    FileWriteLine($logfile, $line)
    FileClose($logfile)
    Sleep (25)

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

    WEnd

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


    Hab aber keine Ahnung warum das so nicht klappt.

    Cu
    SuperElmo

  • Habe das selbe Problem. AutoItscript startet Batchdatei. Die Batch kann ich nicht umgehen, da im Kontext der Batchprogramme die Codepage umgeschaltet werden muß. Danach wieder Umschalten auf die ursprüngliche Codepage.
    Bisher habe ich auch noch keine andere Lösung gefunden, als die Ausgabe der Programme in der Batch statt in die Konsole mittels > in eine Datei umzuleiten, und dann diese Datei auszuwerten. Nicht sehr schön, aber funktioniert.

  • hehe, erste Regel: Form follows Function!
    Was aber bei einigen "DOS" Befehlen stört ist, daß Fehlermeldungen nur auf die Console ausgegeben werden....StdOut<>StdErr
    Was dazu führt, daß z.B. bei Findstr die erfolgreichen Treffer in der Textdatei landen, und die "Fehler" in der (nicht per stderr abfragbaren) Konsole

  • Hi,

    hab jetzt eine Variante die 'fast' so funktioniert wie ich es gern hätte.

    Die Daten aus der Box werden in ein LogFile und in eine GUI geschrieben.
    Neus Problem ist nun, dass scheinbar das 'Edit'-Element von der Anzahl der Zeichen bergenzt ist. ;(

    [autoit]


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

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

    Local $i
    Local $line

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

    local $gui, $edit, $WS_VSCROLL, $WS_HSCROLL, $ES_READONLY
    $gui = GUICreate("MakeLog",1020,520)
    $edit = GUICtrlCreateEdit("", 1, 1, 1000, 500)
    GUISetState()

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

    $i=Run(@ComSpec &" /c makeit ", @ScriptDir, @SW_SHOW, $STDOUT_CHILD+$STDERR_CHILD)

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

    While 1
    $line = StdoutRead($i)
    If @error Then ExitLoop
    WriteLog($line)
    GUICtrlSetData($edit, $line, 1)
    Wend

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

    While 1
    $line = StderrRead($i)
    If @error Then ExitLoop
    WriteLog($line)
    GUICtrlSetData($edit, $line, 1)
    Wend

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

    Func WriteLog($data)
    $file = FileOpen("x:\willi.log", 9)
    FileWriteLine($file, $data)
    FileClose($file)
    EndFunc

    [/autoit]

    Cu
    Superelmo

    P.S. Der Code ist Quick&Dirty... also bitte nicht meckern ;)

  • hehe, erste Regel: Form follows Function!
    Was aber bei einigen "DOS" Befehlen stört ist, daß Fehlermeldungen nur auf die Console ausgegeben werden....StdOut<>StdErr
    Was dazu führt, daß z.B. bei Findstr die erfolgreichen Treffer in der Textdatei landen, und die "Fehler" in der (nicht per stderr abfragbaren) Konsole


    Das stimmt nicht ganz. Man kann auch die Fehler in die Datei pipen!

    Beispiel:

    Code
    dir c:\test > Test.txt 2> Test.log

    In Test.log werden die Fehler reingeschrieben!

    Weitere Info hier: http://www.microsoft.com/resources/docu…n.mspx?mfr=true

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Ich gehe davon aus, daß "makeit" die Batchdatei ist.
    Wieso bekommst du dann eine Rückgabe in StdoutRead() und ich nicht?
    Testscript:

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>
    filedelete("test.bat")
    filewrite("test.bat","dir c:\")
    $i=Run(@ComSpec &" /c test.bat ", @ScriptDir, @SW_SHOW, $STDOUT_CHILD+$STDERR_CHILD)
    $line=""
    While 1
    $line &= StdoutRead($i)
    If @error Then ExitLoop
    ;GUICtrlSetData($edit, $line, 1)
    Wend
    WriteLog($line)

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

    While 1
    $line = StderrRead($i)
    If @error Then ExitLoop
    WriteLog($line)
    ;GUICtrlSetData($edit, $line, 1)
    Wend

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

    shellexecute("willi.txt")

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

    Func WriteLog($data)
    $file = FileOpen("willi.txt", 9)
    FileWriteLine($file, $data)
    FileClose($file)
    EndFunc

    [/autoit]


    /EDIT/ auf einem anderen Rechner ausprobiert funktioniert das Script wie gewünscht...wtf...hier funktionieren auch meine anderen "DOS"-Scripe und geben wie gewünscht auch bei Batchdateien den stdout bzw stderr an AutoIt zurück...

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    8 Mal editiert, zuletzt von Andy (23. Juni 2010 um 12:22)

  • Hier das Ganze in die Editbox:

    Spoiler anzeigen
    [autoit]


    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>

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

    Global $iMemo
    $hGUI = GUICreate("Test", 640, 480)
    $iMemo = GUICtrlCreateEdit("", 0, 0, 640, 480, $ES_AUTOVSCROLL + $WS_VSCROLL + $ES_READONLY)
    GUICtrlSetLimit(-1, 0x7FFFFFFF)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    $prg = "dir "
    $parameter = @SystemDir & " /s"
    $run = Run(@ComSpec & " /c " & $prg & $parameter, @ScriptDir, @SW_HIDE, $STDOUT_CHILD)

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

    While 1
    $line = StdoutRead($run)
    If @error Then ExitLoop
    MemoWrite($line)
    Wend

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

    While 1
    $Msg = GUIGetMsg()
    If $Msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd

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

    $save = MsgBox(4 + 32 + 256, "Save", "Save log?", 10)
    If $save = 6 Then
    $file = FileSaveDialog("Save Log", @ScriptDir, "Log (*.log;*.txt)", 18)
    If Not @error Then
    $log = GUICtrlRead($iMemo)
    FileWrite($file, $log)
    FileClose($file)
    EndIf
    EndIf
    Exit

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

    ; Write a line to the memo control
    Func MemoWrite($sMessage)
    ;~ GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    GUICtrlSetData($iMemo, $sMessage, 1)
    EndFunc ;==>MemoWrite

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

    Einmal editiert, zuletzt von UEZ (23. Juni 2010 um 13:12)

  • UEZ: Perfekt!
    Super, vielen Dank.

    Einen weiteren Punkte hätte ich dann aber doch noch...

    Ziel war auch, bestimmte Ereignisse (Warnings, Error) in der Ausgabe zu erkennen (z.B. durch parsen).
    Gibt es eine Möglichkeite nur bestimmte Textteile einzufärben?

    Mit GUICtrlSetColor($iMemo, 0xFF0000) kann ich ja nur die ganze Box einfärben.

    Danke
    Superelmo