CMD/ Console während der Eingabeausführung ablesen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von mnemonik.

    CMD/ Console während der Eingabeausführung ablesen

    Hallo, in meiner Application sende ich die Eingabe (input) in cmd und erhalte anschließend die Ausgabe (output) in richtextbox. Leider kommt die Ausgabe erst nach dem die Eingabe ausgeführt wurde. Das ist unpraktisch, wenn man z.B. Programme wie ffmpeg, youtube-dl, ... verwendet und die Bearbeitung von Videos einige Zeit in Anspruch nimmt, dann weis man nicht, ob das Programm hängt oder nicht.

    - Gibt es die Möglichkeit cmd-Ausgabe "Live" abzulesen?


    VB.NET-Quellcode

    1. Private p As Process
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. p = New Process()
    4. With p.StartInfo
    5. .CreateNoWindow = True
    6. .FileName = "cmd"
    7. .RedirectStandardInput = True
    8. .RedirectStandardOutput = True
    9. .RedirectStandardError = True
    10. .UseShellExecute = False
    11. .StandardOutputEncoding = System.Text.Encoding.Default
    12. End With
    13. p.Start()
    14. p.StandardInput.WriteLine("Hier soll der cmd-Befehl sein")
    15. p.StandardInput.WriteLine("exit")
    16. RichTextBox1.Text = p.StandardOutput.ReadToEnd()
    17. End Sub


    P.S.: wenn es möglich dann bitte ausführlich für Dummies erklären :) Danke!
    Ich frage mich gerade, warum du überhaupt erst cmd startest und dann dein Programm. Du kannst das Programm doch direkt starten. Evtl. ist dann das Auslesen auch einfacher.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    Marcus Gräfe schrieb:

    Ich frage mich gerade, warum du überhaupt erst cmd startest und dann dein Programm. Du kannst das Programm doch direkt starten. Evtl. ist dann das Auslesen auch einfacher.


    Naja, die Programme youtube-dl oder ffmpeg habe keine GUI, man kann nur über cmd arbeiten. Die eigene GUI ist der schnellste Weg um produktiv zu sein und nicht jedes Mal manuell alles einzutippen.

    xored, werde alles anschauen
    Stimmt, finde ich auch gut dass du das machst :thumbsup: , wollte es nur erwähnen. Auch für YT-Downloads, kann man einfach auch den JDownloader nehmen. Aber hast schon recht, nichts ist besser, als ein für sich selbst maßgeschneidertes Programm.
    So Leute, vielen Dank an alle, besonders an xored! Ich habe den Code unter dem xored's-Link modifiziert und jetzt ist er funktionsfähig)

    So sieht er jetzt aus!

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub p_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) Handles Shrinker.OutputDataReceived
    3. Me.Invoke(New WriteA(AddressOf Write), e.Data & Environment.NewLine)
    4. End Sub
    5. Private Sub p_ErrorDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) Handles Shrinker.ErrorDataReceived
    6. Me.Invoke(New WriteA(AddressOf Write), e.Data & Environment.NewLine)
    7. End Sub
    8. Private Sub Write(ByVal Line As String)
    9. TextBox1.Text &= Line
    10. TextBox1.SelectionStart = TextBox1.Text.Length
    11. TextBox1.ScrollToCaret()
    12. End Sub
    13. Private WithEvents Shrinker As Process
    14. Private Delegate Sub WriteA(ByVal Text As String)
    15. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    16. Shrinker = New Process
    17. With Shrinker.StartInfo
    18. .FileName = "cmd"
    19. .RedirectStandardError = True
    20. .RedirectStandardInput = True
    21. .RedirectStandardOutput = True
    22. .CreateNoWindow = True
    23. .UseShellExecute = False
    24. End With
    25. Shrinker.Start()
    26. Shrinker.StandardInput.WriteLine(" Hier soll der cmd-Code sein ")
    27. Shrinker.StandardInput.WriteLine(" Hier soll der weitere cmd-Code sein ")
    28. Shrinker.BeginErrorReadLine()
    29. Shrinker.BeginOutputReadLine()
    30. End Sub
    31. End Class


    P.S.: nicht vergessen beim Textbox multiline und scroll zu erlauben! ;)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mnemonik“ ()

    mnemonik schrieb:

    habe keine GUI, man kann nur über cmd arbeiten

    Falls du das auf VB beziehst, kann ich nichts dazu sagen, aber rein auf Windows bezogen ist diese Aussage falsch. Ich konvertiere oft mit ffmpeg und rufe nicht erst cmd auf.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich starte FFMPEG über Process und bekomme gemeldet, wenn der Prozess beendet ist (auch wenn ffmpeg rausfliegt) und kann dann die nächste Datei konvertieren.
    Hab mir da ein kleines Programm drum herum geschrieben, ist nicht weiter wild.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mnemonik
    Ja, meist über Batchdateien (*.bat oder *.cmd), aber genauso kann man das über Start - Ausführen in Windows machen. Worauf ich hinaus will ist einfach, dass du eine ffmepg-Befehlszeile einfach direkt ausführen kannst. Der einzige Grund über die cmd.exe zu gehen, ob nun via VB oder in Windows manuell, ist dass man die Ausgaben noch sieht, weil sich das Fenster nicht sofort wieder schließt.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum