Befehl an CMD schicken und Ergebnis auslesen?

  • Hallo,
    also ich bin mir sicher, dass ich das schon mal gemacht habe, aber irgendwie funktioniert es heute nicht richtig. :D

    Ich habe folgendes geschrieben, um den Befehl "help" (als Beispiel) an die Konsole zu schicken und den Stream auszulesen:

    [autoit]

    #include <Constants.au3>

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

    $com = Run(@ComSpec,@ScriptDir,@SW_SHOW, $STDIN_CHILD + $STDOUT_CHILD)
    $i = 0

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

    while 1
    consolewrite(StdoutRead($com))
    if $i = 10 then
    StdinWrite($com,"help")
    StdinWrite($com)
    EndIf
    $i += 1
    sleep(100)
    WEnd

    [/autoit]

    Am Ende steht dann in der Kosole von SciTE:

    Code
    Microsoft Windows [Version 6.1.7601]
    Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.
    
    
    D:\Dateien\autoIt-Projekte\extras>Mehr?

    Ich weiß nicht was ich machen muss, dass "help" gesendet und das Ergebnis empfangen wird.
    Kann mir jemand helfen?

    Schon mal ein großes Dankescön und LG :)
    limond

    Einmal editiert, zuletzt von limond (1. April 2012 um 17:44)

  • Ich hab deinen Code mal ein wenig umgebaut... So sieht es ordentlicher aus, und funktioniert ;).

    Spoiler anzeigen
    [autoit]

    #include <Constants.au3>

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

    $hPID_ComSpec = Run(@ComSpec, @ScriptDir, @SW_SHOW, BitOR($STDIN_CHILD, $STDOUT_CHILD))
    StdinWrite($hPID_ComSpec, "help" & @CRLF)

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

    While Sleep(50)
    $sOut = StdoutRead($hPID_ComSpec)

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

    If @error Then ExitLoop
    If $sOut <> "" Then ConsoleWrite($sOut & @CRLF)
    WEnd

    [/autoit]


    Wieso rufst du direkt nachdem du "help" in den Stream schreibst StdinWrite ohne 2ten Parameter auf? Und wozu die Blödsinnige If Abfrage mit $i?
    Das Problem liegt übrigens daran, dass du keinen Zeilenumbruch (@CRLF) mit in den Stream schreibst. Dadurch wird "Help" nie bestätigt.

  • Danke :),

    Zitat

    Wieso rufst du direkt nachdem du "help" in den Stream schreibst StdinWrite ohne 2ten Parameter auf?

    >>Wenn die Funktion ohne zweites Argument aufgerufen wird, dann schließt StdinWrite den Stream und macht weiteres Schreiben in ihn ungültig.<< [AutoIt-Funktionsreferenz]
    Ich habe schon früher einmal mit "StdinWrite" und "StdoutRead" gearbeitet und habe das Abschließen des Streams mit dem Bestätigen verwechselt. :pinch:

    Zitat

    Und wozu die Blödsinnige If Abfrage mit $i?

    Das war nur provisorisch gelöst, da ich den Befehl erst eine Sekunde nach dem ersten Auslesen des Streams senden wollte und er trotzdem unter die "while"-Schleife sollte.
    Im Endeffekt gibt das wenig Sinn, ich weiß. :D

    Zitat

    Das Problem liegt übrigens daran, dass du keinen Zeilenumbruch (@CRLF) mit in den Stream schreibst. Dadurch wird "Help" nie bestätigt.

    Und dafür nochmals vielen Dank :)

    LG limond