Konsole öffnen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Konsole öffnen

    Hallo liebe Community,

    Ich habe folgendes Problem, ich habe eine Windows Form mit einer Richtextbox und einem Button. Mit dem Button will ich eine Konsolen Anwendung öffnen welche dann ausgelesen wird und in die Richtextbox geschrieben wird.

    Das Problem dabei ist das wenn ich die Konsolen Anwendung mit Process.start öffnen will "blinkt" die Konsole kurz auf und verschwindet danach wieder und nichts passiert.
    Wenn ich die Konsole normal starte geht es.

    Meine 2te Frage wäre noch ob man es so machen kann das die Konsole direkt über die Windows Form gehen kann so das sich die Konsole sich nicht öffnet sondern das es gleich im Form erscheint, sozusagen Richtextbox statt Konsole.

    MfG. xXLinkeXx
    Also die Funktion sieht wie folgt aus:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Konsole As New Process()
    3. 'Definieren:
    4. Konsole.StartInfo.FileName = "Konsolen.exe"
    5. Konsole.StartInfo.Arguments = "-all"
    6. 'Umleitung:
    7. Konsole.StartInfo.UseShellExecute = False
    8. Konsole.StartInfo.RedirectStandardOutput = True
    9. 'Starten:
    10. Konsole.Start()
    11. 'Ausgabe:
    12. Dim output As String = Konsole.StandardOutput.ReadToEnd()
    13. 'Ausgabe in Textbox:
    14. RichTextBox1.Text = RichTextBox1.Text & vbNewLine & output
    15. End Sub
    falls ein Fehler kommt, benötigst du StandardError...
    evtl. probierst du es mal über die cmd diese zu starten, weil dort funktioniert StandardOutput garantiert, du verwendest einfach nur StandardInput um den Befehl zu schreiben...
    bei StartInfo kannst du festlegen, dass diese Unsichtbar starten sollen, somit kannst du es auch direkt in der RichTextBox machen, ohne dass etwas anderes aufblinkt ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Irgendwie versteh ich das nicht^^ kannst du mir villt nen kleines Beispiel vorgeben?
    Und wie soll ich das verstehen das ich dann die Richtextbox als Konsole benutzen kann? Kann ich dann auch da eingaben machen die gleich irgendwie Umgeleitet werden und ausgeführt?

    MfG. xXLinkeXx
    so ungefähr:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Konsole As New Process()
    3. 'Definieren:
    4. Konsole.StartInfo.FileName = "cmd"
    5. Konsole.StartInfo.WorkingDirectory = OrdnerInWelchemDieKonsolenExeist
    6. 'Umleitung:
    7. Konsole.StartInfo.UseShellExecute = False
    8. Konsole.StartInfo.RedirectStandardOutput = True
    9. Konsole.StartInfo.RedirectStandardInput = True
    10. 'Starten:
    11. Konsole.Start()
    12. 'Ausgabe:
    13. Konsole.StandardInput.WriteLine("Konsole.exe -all")
    14. Dim output As String = Konsole.StandardOutput.ReadToEnd() ' TODO: Filtern
    15. 'Ausgabe in Textbox:
    16. RichTextBox1.Text = RichTextBox1.Text & vbNewLine & output
    17. End Sub


    aber evtl. solltest du allgemein mal Überprüfen ob die Datei im system32 Ordner ist?! Andernfalls musst du den Kompletten Pfad angeben(soweit ich weiß geht es hier nicht mit dem aktuellen Ordner?!)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Konsole As New Process()
    3. 'Definieren:
    4. Konsole.StartInfo.FileName = "cmd"
    5. Konsole.StartInfo.WorkingDirectory = "C:\Random\"
    6. Konsole.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    7. 'Umleitung:
    8. Konsole.StartInfo.UseShellExecute = False
    9. Konsole.StartInfo.RedirectStandardOutput = True
    10. Konsole.StartInfo.RedirectStandardInput = True
    11. 'Starten:
    12. Konsole.Start()
    13. 'Ausgabe:
    14. Konsole.StandardInput.WriteLine("Random.exe -all")
    15. Dim output As String = Konsole.StandardOutput.ReadToEnd()
    16. 'Ausgabe in Textbox:
    17. RichTextBox1.Text = RichTextBox1.Text & vbNewLine & output
    18. End Sub


    So sieht es jetzt bei mir aus, aber wenn ich den Button betätige passiert folgendes:
    - Eine Konsole öffnet sich mit keinem Inhalt
    - Das Programm "hängt sich auf"
    - "Ich schließe die Konsole"
    - In der RichTextBox erscheint der Inhalt der eigentlich in der Konsole sein sollte

    Nun meine Fragen:
    1. Wie geht das mit dem unvisible ich hab da nur WindowStyle = ProcessWindowStyle.Hidden gefunden
    2. In so zu sagen "Laufzeit" den Konsolen Inhalt in die Richtextbox einfügen
    3. Wie könnte man es verwirklichen auch Eingaben zu machen? Villt mit einem Button + Textbox welche dann einen StandardInput senden?
    1. das wäre es doch ;)
    2. Das versteh ich nicht?!
    3. Jo geht auch z.B. aber du kannst es auch direkt in der RichTextBox machen, dafür benötigst du jedoch eine eigene Methode das auszulesen...

    Es hängt sich auf, da ReadToEnd() bis zum schluss alles liest, aber es könnte ja über StandardInput noch etwas kommen->deshalb erst beim schließen, du könntest auch ReadLine verwenden...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Danke erstmal für deine Antwort.

    Also mit 2. meine ich:

    Wenn ich eine Konsole öffne erscheint ja der Inhalt und je nach Funktion rattern dann dort auch ständig neue Informationen durch.
    Und da ist meine Frage ob das auch so funktionieren kann mit der Richtextbox, weil wie gesagt sich das Programm ja aufhängt.

    Zu 3. Werde das nachher mal testen ;)

    MfG. xXLinkeXx

    Es hängt sich auf, da ReadToEnd() bis zum schluss alles liest, aber es könnte ja über StandardInput noch etwas kommen->deshalb erst beim schließen, du könntest auch ReadLine verwenden...

    2. ist somit denke ich beantwortet, oder?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ja, denke schon aber wie gesagt werde es nachher mal testen wenn ich mehr Zeit habe.

    EDIT:

    Also ich habe es jetzt getestet mit ReadLine() womit aber nur die erste Zeile ausgelesen wurde und da ich nicht weiß wie viele Zeilen da durch rattern kann ich das auch nicht definieren und da solange keine Rückmeldung kommt bis er zum "endlosen" Ende gelesen hat sowieso nicht.

    WindowStyle = ProcessWindowStyle.Hidden funktioniert nicht. Wenn ich den Button betätige öffnet sich die Konsole (ohne Inhalt) das Programm hängt sich auf und wenn ich dann die Konsole schließe erscheint der Text der, der eigentlich in der Konsole wäre in der RichTextBox.

    Ich steh gerade total aufm Schlauch und weiß nicht wie ich das alles ändern soll. Hilfe :D

    MfG. xXLinkeXx

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

    du musst einfach ReadLine so lange wie möglich immer wieder aufrufen :P

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim Konsole As New Process()
    3. 'Definieren:
    4. Konsole.StartInfo.FileName = "cmd"
    5. Konsole.StartInfo.WorkingDirectory = "C:\Random\"
    6. Konsole.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    7. 'Umleitung:
    8. Konsole.StartInfo.UseShellExecute = False
    9. Konsole.StartInfo.RedirectStandardOutput = True
    10. Konsole.StartInfo.RedirectStandardInput = True
    11. 'Starten:
    12. Konsole.Start()
    13. 'Ausgabe:
    14. Konsole.StandardInput.WriteLine("Random.exe -all")
    15. Dim output As String
    16. Do
    17. output = Konsole.StandardOutput.ReadLine()
    18. 'Ausgabe in Textbox:
    19. RichTextBox1.Text = RichTextBox1.Text & vbNewLine & output
    20. Loop Until output Is Nothing
    21. End Sub

    das könnte dann so aussehen ;), bzw. du rufst ReadLine einfach erst nach dem nächsten mal schreiben auf...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also ich weiß ja auch nicht aber irgendwie ist das Endergebnis immer das selbe :pinch:
    1. Die geöffnete Konsole verschwindet nicht
    2. Die Anwendung hängt sich auf
    3. Die Richtextbox füllt sich erst nach dem schließen der Konsole

    Also ich denke mal das eines der Hauptprobleme ist das der ja als abfragt und das die Konsole alle paar Sekunden andere Informationen ausgibt.
    Bei der Konsole die ich aufrufen will handelt es sich um meine Server Konsole welche ich wie schon gesagt auslesen will und gegeben falls auch Befehle zurück "senden" will um bestimmte Sachen auszuführen.
    Vielleicht hilft das ja ein bisschen mehr das Problem zu lösen vielleicht kann das ja mal jemand bei sich selbst testen , weil bei mir tauchen immer wieder die 3 oben genannten Probleme auf.

    Edit: Ich hab mir überlegt ob es vielleicht möglich wäre die Output abfrage in einen Timer zu bauen aber irgendwie kann ich mir da wiederum nicht vorstellen ob das nicht auch Fehler gibt :-\

    MfG. xXLinkeXx
    Ja ich starte die "cmd" Konsole und öffne dann damit die Server Konsole. Und dann fährt der Server ja erst mal hoch und dabei gibt er andauernd Informationen aus über geladene Informationen und soweiter. Wenn er hochgefahren ist und irgendwas passiert auf dem Server dann gibt er wieder was aus. D.h. ich gebe eigentlich ja nur einmal was ein und das ist, das was in die "cmd" Konsole geschrieben wird um die Server Konsole zu öffnen.
    Da kann ich nicht immer erst nen Input senden um zu wissen was gerade auf dem Server abgeht.
    Weil schreiben tue ich ja gegeben falls dann um per Befehl mal was am Server zu ändern und das mach ich ja nicht als :wacko:
    Ich hatte das Problem auch nur bei mir ging es um eine Minecraft Bukkit Konsole :D aber mach das um es auszulesen:

    VB.NET-Quellcode

    1. Private Delegate Sub WriteA(ByVal Text As String)
    2. Private WithEvents p As Process
    3. Sub Konsole()
    4. p = New Process()
    5. p.StartInfo.FileName = "cmd"
    6. p.StartInfo.Arguments = "C:\Random\"
    7. p.StartInfo.RedirectStandardError = True
    8. p.StartInfo.RedirectStandardInput = True
    9. p.StartInfo.RedirectStandardOutput = True
    10. p.StartInfo.CreateNoWindow = True
    11. p.StartInfo.UseShellExecute = False
    12. p.Start()
    13. p.BeginErrorReadLine()
    14. p.BeginOutputReadLine()
    15. p.StandardInput.WriteLine(""Random.exe -all"")
    16. End Sub
    17. Private Sub p_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) Handles p.OutputDataReceived
    18. Me.Invoke(New WriteA(AddressOf Write), e.Data & Environment.NewLine)
    19. End Sub
    20. Private Sub p_ErrorDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs) Handles p.ErrorDataReceived
    21. Me.Invoke(New WriteA(AddressOf Write), e.Data & Environment.NewLine)
    22. End Sub
    23. Private Sub Write(ByVal Line As String)
    24. Output.Text &= Line 'Output.text ist bei mir die RichTextBox :)
    25. End Sub
    26. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    27. p.StandardInput.WriteLine("")
    28. End Sub



    Ich hoffe ich konnte dir helfen !

    Es sind vll ein paar fehler drinnen :D

    EDIT: :O Ich hab gerade gesehen das der Thread schon alt is sry :pinch:
    @DarkestMan: Du hast eienn 2 1/4 Jahre alten Thread aufgewärmt. :D


    Edit by Manschula: Und aus diesem Grund schließe ich hier jetzt ab --> Thema geschlossen
    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!

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