CMD in VB mit ausgabe in RichTextbox und nachträglichen übergabe möglichkeit?!

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Ruerte.

    CMD in VB mit ausgabe in RichTextbox und nachträglichen übergabe möglichkeit?!

    Hallo Leute,

    Ich habe aktuell ein Programm geschrieben, das ein Befehl als CMD Process bearbeitet und live in eine RichTextBox wiedergibt. Dazu habe ich den Code: CMD-output in textbox schreiben!? verwendet.
    ich wollte jetzt fragen ob es eine Einfachere Möglichkeit gibt die es mir ermöglicht auch einfach der cmd weitere befehle zu geben.

    zb. Ich starte erst einen Ping und anschließend kann ich durch eine TextBox und einen Butten noch einen Ping zu zb. einen anderen Server starten usw. Dies soll aber weiterhin ausgegeben werden.

    ich hoffe man kann grob verstehen was ich meine und freue mich auch Vorschläge zur Herangehensweise.

    ich nehme mal an das ich am besten an den bestehenden Process ein neuen Befehl anhänge, wie genau mach ich dies jedoch? :D
    Lg. Ruerte
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    VB.NET-Quellcode

    1. Dim p As New Process
    2. p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8
    3. p.StartInfo.CreateNoWindow = True
    4. p.StartInfo.UseShellExecute = False
    5. p.StartInfo.RedirectStandardOutput = True
    6. p.StartInfo.FileName = "xxxxxxxxxx"
    7. p.StartInfo.Arguments = "xxxxxxxx"
    8. p.Start()
    9. Dim s As String = p.StandardOutput.ReadToEnd
    10. RichTextbox.text = s


    Für Ping gehts aber einfacher direkt über vb
    Wie füge ich nun beispielsweise über einen anderen Button ein Befehl zum Process bzw. CMD hinzu?

    VB.NET-Quellcode

    1. p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8
    2. p.StartInfo.CreateNoWindow = True
    3. p.StartInfo.UseShellExecute = False
    4. p.StartInfo.RedirectStandardOutput = True
    5. p.StartInfo.FileName = "cmd"
    6. p.Start()
    7. Dim s As String = p.StandardOutput.ReadToEnd
    8. RichTextBox1.Text = s


    PS: p.StandardOutput.ReadToEnd gibt mir aber nicht Live den Prozess aus :/
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    So z.B.

    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim p As New Process
    3. p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8
    4. p.StartInfo.CreateNoWindow = True
    5. p.StartInfo.UseShellExecute = False
    6. p.StartInfo.RedirectStandardOutput = True
    7. p.StartInfo.FileName = "cmd"
    8. p.StartInfo.Arguments = "ping /?" 'Hier ne textbox hin in die die Agumente für dem befehl eingetragen werden
    9. p.Start()
    10. Dim s As String = p.StandardOutput.ReadToEnd
    11. RichTextBox1.Text = s
    12. ' ping /?
    13. 'Die Parameter werden ebenfalls mit einem Leerzeichen getrennt eingegeben. Die IP-Adresse oder der Rechnername nach den Parametern. Einige Beispiele:
    14. 'ping -t <IP-Adresse>
    15. 'Führt den Ping-Befehl solange aus, bis man es mit STRG + C abbricht.
    16. 'ping -a <IP-Adresse>
    17. ' Hostname der IP-Adresse wird ermittelt und ping ausgeführt.
    18. 'ping -n <Anzahl> <IP-Adresse>
    19. 'Hierbei kann man selbst festlegen, wie oft die Echoanforderung gesendet wird.
    20. 'ping -l <Anzahl> <IP-Adresse>
    21. 'Die Größenangabe für die Pakete, die geschickt werden.
    22. 'ping -f <IP-Adresse>
    23. 'Ein Flag wird gesetzt, damit die übertragenen Pakete nicht fragmentiert werden.
    24. 'ping -i <Anzahl> <IP-Adresse>
    25. 'Die TTL, die beim Verschicken mitgegeben wird, kann beeinflusst werden.
    26. 'ping -i <Diensttyp> <IP-Adresse>
    27. 'Der Diensttyp wird festgelet, z.B. ICMP. Funktioniert wie einige andere Parameter nur bei IPv4.
    28. End Sub


    Oder rein in VB:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim nTime As Integer = ServerPing("vbarchiv.net")
    3. If nTime <> -1 Then
    4. Label1.Text = "Server erreichbar: Reaktionszeit: " & nTime & " MSek."
    5. Else
    6. Label1.Text = "Server nicht erreichbar!"
    7. End If
    8. End Sub
    9. Public Function ServerPing(ByVal Hostname As String) As Integer
    10. Try
    11. Dim oTime As New System.Diagnostics.Stopwatch
    12. oTime.Start()
    13. If My.Computer.Network.Ping(Hostname) Then
    14. oTime.Stop()
    15. Return CInt(oTime.ElapsedMilliseconds)
    16. Else
    17. Return -1
    18. End If
    19. Catch ex As Exception
    20. Return -1
    21. End Try
    22. End Function​

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „TVX“ ()

    Es geht mir eigentlich nicht um den Ping, sondern um die Ausführung einer CMD

    Starten tu ich die CMD als Process über:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Using p As New Process
    3. AddHandler p.OutputDataReceived, AddressOf Me.Process_OutputDataReceived
    4. ' Process definieren
    5. With p.StartInfo
    6. .FileName = "cmd"
    7. .CreateNoWindow = True
    8. .UseShellExecute = False
    9. .RedirectStandardInput = True
    10. .RedirectStandardOutput = True
    11. End With
    12. ' Process starten
    13. p.Start()


    der erste Befehl danach wird durch (sw) aufgegeben:

    VB.NET-Quellcode

    1. ' Auszuführende Befehle
    2. Using sw As IO.StreamWriter = p.StandardInput
    3. sw.WriteLine("ping www.google.de")
    4. End Using
    5. ' Ausgabe
    6. p.BeginOutputReadLine()
    7. End Using
    8. End Sub


    restlicher Code:

    VB.NET-Quellcode

    1. Private Delegate Sub LogDelegate(ByVal message As String, ByVal addDateTime As Boolean)
    2. Private Sub AppendLogLine(ByVal message As String, Optional ByVal addDateTime As Boolean = False)
    3. If addDateTime Then message = message
    4. With RichTextBox1
    5. If .InvokeRequired Then
    6. .Invoke(New LogDelegate(AddressOf Me.AppendLogLine), message, addDateTime)
    7. Else
    8. .AppendText(message & vbNewLine)
    9. End If
    10. End With
    11. End Sub
    12. Private Sub Process_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs)
    13. Me.AppendLogLine(e.Data, True)
    14. End Sub


    wie bereits beschrieben ist diese vom Beispiel: CMD-output in textbox schreiben!?
    Ich versteh einfach nur nicht wie ich einen weiteren Befehl wie zb. shutdown -s angeben kann (Durch ein neuen Button)

    Ich muss theoretisch erst einmal das Beenden des Process nach Ausführung des Befehls verhindern, nur leider weiß ich nicht wie :c
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Ruerte“ ()

    Using sw As IO.StreamWriter = p.StandardInput ??? ?(
    sw.WriteLine("ping google.de")
    End Using
    X/


    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. RichTextBox1.Text = CmdManager("cmd", "ping /?")
    3. End Sub
    4. Function CmdManager(ByVal FileName As String, ByVal Arguments As String) As String
    5. Dim p As New Process
    6. p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8
    7. p.StartInfo.CreateNoWindow = True
    8. p.StartInfo.UseShellExecute = False
    9. p.StartInfo.RedirectStandardOutput = True
    10. p.StartInfo.FileName = FileName
    11. p.StartInfo.Arguments = Arguments
    12. p.Start()
    13. Dim s As String = p.StandardOutput.ReadToEnd
    14. Return s
    15. End Function​
    Ich erklär am besten mal was genau ich vorhabe, ist glaube ich besser ;D

    Ich möchte ein Programm erstellen, was Ein "Start / Stopp" Button hat auf Start soll der Befehl: java -Xms1024M -Xmx1024M -jar server.jar gestartet werden.
    Nun soll es auch eine TextBox und ein "Senden" Button geben mit denen ich in den process befehle eingeben kann.

    Dabei soll der Komplette Inhalt der CMD live in eine RichTextBox aktualisiert werden. Der Process soll erst beendet werden wenn man auf "Stopp" drückt.
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Der Befehl startet einen Server, ich glaub ich muss die Sache eh etwas anders angehen da ich einige Sachen auser acht gelassen habe, ich danke dir aufjedenfall schon mal an der stele und werde im laufe des tages wenn ich zeit habe ein Neues "Passenderes" Thema dazu aufmachen.

    LG Ruerte

    #Erledigt
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.

    Ruerte schrieb:

    Der Befehl startet einen Server
    Gelegentlich, um nicht höchst selten zu sagen, soll es hilfreich sein, den ganzen Plan mal zu posten, damit beim Helfen auch tatsächlich geholfen werden kann.
    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!

    Ruerte schrieb:

    werde im laufe des tages wenn ich zeit habe ein Neues "Passenderes" Thema dazu aufmachen.
    Wird wahrscheinlich ausführlich und unter passenden Titel folgen!
    Unfortunately, this Signature is not available in Germany because it may contain music for which GEMA
    has not granted the respective music rights. Sorry about that.