Logging der Ausgabe von verstecktem CMD-Window

  • Hallo,

    ich möchte in einem versteckten CMD-Window ein batch file ausführen (Update-Routine) und die Ausgabe des CMD-Fensters mitloggen. Soweit so gut, das Verstecken mit SW_HIDE hat geklappt, auch das Senden der Kommandozeilen-Eingabe per ControlSend funktioniert:

    Local $iPID = Run(@ComSpec & " /c StartDirectUpdater.bat", "U:\Eigene Dateien\Tools\swUpdater", @SW_HIDE)
    ;Wait for CMD to be opened
    $result = WinWait("C:\Windows\system32\cmd.exe", "", 15)
    Sleep(2000)
    ControlSend("C:\Windows\system32\cmd.exe", "", "", "sendhexfile filename" & "{ENTER}")
    MsgBox($MB_OK, "Result", $result);

    Wenn ich der Run-Funktion nun aber noch die Flags $STDERR_CHILD + $STDOUT_CHILD verpasse, die ich für das Logging in einer Datei ja benötige, scheint das ControlSend nicht mehr zu wirken. Das erkenne ich daran, dass bei meinem upzudatenden Client eben kein Update passiert.


    Als Anmerkung vielleicht noch: Das Sleep wird benötigt, weil das Batch File zunächst einige Ausgaben macht bevor es den Befehl interpretieren kann. Schickt man ihn zu früh, wird er u.U. nicht übernommen.


    Danke schonmal!

    Einmal editiert, zuletzt von seventh_son (27. Oktober 2015 um 08:08)

    • Offizieller Beitrag

    auch das Senden der Kommandozeilen-Eingabe per ControlSend

    *schüttel*
    Schau dir mal in der Hilfe an: StdinWrite, StdoutRead
    Das löst sowohl die Eingabe als auch die Ausgabe ganz seriös.

    Noch einfacher ist es natürlich, wenn du den Inhalt der Batch durch ein AutoIt Skript ersetzt.

  • Danke. Mit StdinWrite hatte ich aber auch schon experimentiert, habe es aber nicht geschafft, dass die Kommandozeile an das COMD-Window weitergegeben wird:

    Local $iPID = Run(@ComSpec & " /c StartDirectUpdater.bat", "U:\Eigene Dateien\Tools\swUpdater", @SW_HIDE, $STDIN_CHILD)
    ;Wait for CMD to be opened
    $result = WinWait("C:\Windows\system32\cmd.exe", "", 15)
    Sleep(3000)
    StdinWrite($iPID, "sendhexfile filename" & "{ENTER}");
    MsgBox($MB_OK, "Result", $result);

    Liegt das vielleicht daran, dass mit StdinWrite keine ENTER-Taste übermittelt werden kann?

    Einmal editiert, zuletzt von seventh_son (27. Oktober 2015 um 08:30) aus folgendem Grund: Edit: Hab es. ENTER erzeugt man natürlich in einem Stream durch @CRLF.

    • Offizieller Beitrag

    Liegt das vielleicht daran, dass mit StdinWrite keine ENTER-Taste übermittelt werden kann?

    Schau dir doch das Hilfebsp. an. Da steht es im Code:

    Zitat von Hilfe zu StdinWrite

    ; Calling StdinWrite without a second parameter closes the stream.
    StdinWrite($iPID)

    • Offizieller Beitrag

    He, probiere es bitte aus. Natürlich musst du den (Eingabe)Stream schließen, sonst wird die Eingabe doch niemals als beendet erkannt. Genau das machst du per Hand mit ENTER.
    Eingabestream und Ausgabestream sind zwei getrennte Dinge. Deshalb heißen die Funktionen ja auch: StdinWrite, StdoutRead.