StdinWrite

  • Hi,

    ich hab mich eben mal etwas mit StdinWrite beschäftigt, weil es mir öfters Probleme machte. Ich glaube ich habe es jetzt verstanden, wollte bloß noch einmal nachfragen, ob es so auch korrekt ist. Erst einmal ein Testskript:

    Spoiler anzeigen
    [autoit]

    Global $i_pid = Run('"' & @ComSpec & '" /c "diskpart.exe"', @SystemDir, @SW_HIDE, 3)
    Global $s_stdin = "SELECT DISK 0" & @CRLF & "HELP" & @CRLF & "EXIT"
    StdinWrite($i_pid, $s_stdin)
    StdinWrite($i_pid)
    While ProcessExists($i_pid)
    Sleep(50)
    WEnd
    MsgBox(64, "Debug", StdoutRead($i_pid))
    Exit

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

    Global $i_pid = Run('"' & @ComSpec & '" /c "diskpart.exe"', @SystemDir, @SW_HIDE, 3)
    StdinWrite($i_pid, "SELECT DISK 0" & @CRLF)
    StdinWrite($i_pid, "HELP" & @CRLF)
    StdinWrite($i_pid, "EXIT")
    StdinWrite($i_pid)
    While ProcessExists($i_pid)
    Sleep(50)
    WEnd
    MsgBox(64, "Debug", StdoutRead($i_pid))
    Exit

    [/autoit]


    Zunächst einmal starte ich diskpart.exe. Dann selektiere ich den ersten Datenträger und gebe den HELP-Befehl ein. Daraufhin schließe ich den Standard-Input und warte solange bis der Prozess nicht mehr existiert. Danach lasse ich mir die Standard-Ausgabe in einer MsgBox ausgeben.

    Soweit so gut. Sehe ich das richtig, dass StdinWrite($i_pid) nicht nur den Standard-Input absetzt, sondern gleichzeitig den Prozess beendet? Oder kommt mir das nur so vor? Weil dann könnte ich ja auf die While-Schleife verzichten, was aber zu Fehlern führt. Ich dachte bisher, dass Anwendungen wie diskpart.exe am Ende explizit mit EXIT (halt anwendungsabhängig) beendet werden müssen, da sonst der Prozess weiter existiert.

    Soll heißen, wenn ich mir in einem Skript erst einmal einen längeren Standardinput generieren möchte, so muss ich entweder immer wieder StdinWrite mit dem String-Parameter aufrufen (2. Beispiel), oder aber den String für den StandardInput zusammensetzen und am Ende einmal mittels StdinWrite ausführen (1. Beispiel)? Auf jedenfall verhindert StdinWrite ohne String die Eingabe weiterer Strings und beendet die Anwendung?

    Bitte korrigiert mich, falls ich falsch liege!

    MFG

  • Hi,

    ja, wird wirklich nichts geschlossen. Für die beste Lösung halte ich es den Puffer nach und nach zu füllen und dann am Ende einmal. StdinWrite mit String und danach ohne auszuführen.

    [/closed]