CMD in Programm "einbetten"

  • VB.NET

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

    CMD in Programm "einbetten"

    Hallo,

    ich habe auf pastebin einen interessanten Code gefunden mit dem man angeblich CMD in einer Windows Form ausführen kann und dieses Programm dann auch Befehle entgegen nimmt. Das klang recht interessant daher habe ich mir das mal einfach angesehen.
    Gleichzeitig habe ich das selbst einmal implementiert, das Programm scheint auch wirklich sowas wie ping XYZ ausführen zu können. Bei tree C:\ scheitert es jedoch :D

    Warum ist das so, laut Code müsste das Programm doch merken wenn ein Argument hinzugefügt wurde, was ja auch bei ping XYZ funktioniert. Mich würde jetzt brennend interessieren, wie man dies korrigieren könnte?

    Code mal als Zitat von Pastebin:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private psi As ProcessStartInfo
    3. Private cmd As Process
    4. Private Delegate Sub InvokeWithString(ByVal text As String)
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Try
    7. cmd.Kill()
    8. Catch ex As Exception
    9. End Try
    10. TextBox2.Clear()
    11. If TextBox1.Text.Contains(" ") Then
    12. psi = New ProcessStartInfo(TextBox1.Text.Split(" ")(0), TextBox1.Text.Split(" ")(1))
    13. Else
    14. psi = New ProcessStartInfo(TextBox1.Text$)
    15. End If
    16. Dim systemencoding As System.Text.Encoding
    17. System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    18. With psi
    19. .UseShellExecute = False
    20. .RedirectStandardError = True
    21. .RedirectStandardOutput = True
    22. .RedirectStandardInput = True
    23. .CreateNoWindow = True
    24. .StandardOutputEncoding = systemencoding
    25. .StandardErrorEncoding = systemencoding
    26. End With
    27. cmd = New Process With {.StartInfo = psi, .EnableRaisingEvents = True}
    28. AddHandler cmd.ErrorDataReceived, AddressOf Async_Data_Received
    29. AddHandler cmd.OutputDataReceived, AddressOf Async_Data_Received
    30. cmd.Start()
    31. cmd.BeginOutputReadLine()
    32. cmd.BeginErrorReadLine()
    33. End Sub
    34. Private Sub Async_Data_Received(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    35. Me.Invoke(New InvokeWithString(AddressOf Sync_Output), e.Data)
    36. End Sub
    37. Private Sub Sync_Output(ByVal text As String)
    38. TextBox2.AppendText(text & Environment.NewLine)
    39. TextBox2.ScrollToCaret()
    40. End Sub
    41. End Class

    VB.neter0101 schrieb:

    Bei tree C:\ scheitert es jedoch
    Das äußert sich wie genau?
    Fang an mit Option Strict On.
    =====
    Kläre zunächst die Syntax für diesen Befehl in der Entwicklungsumgebung auf:

    VB.NET-Quellcode

    1. Process.Start("tree c:\")

    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 „RodFromGermany“ ()

    @VB.neter0101 Ich hab mal ein Testprogramm von mir probiert, das lief bis auf das Encoding auf Anhieb, hier ises korrekt.
    Form, 2 Button, TextBox, RichTextBox und tree c::
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim systemencoding As System.Text.Encoding
    2. System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    3. Imports System.Text
    4. Imports System.Globalization
    5. Public Class Form1
    6. Private cmd As Process
    7. Private Sub btnSend_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSend.Click
    8. cmd.StandardInput.WriteLine(TextBox1.Text)
    9. End Sub
    10. Private Sub btnConnect_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnConnect.Click
    11. StartProcess()
    12. End Sub
    13. Sub StartProcess()
    14. Dim enc = Encoding.GetEncoding(CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    15. cmd = New Process()
    16. cmd.StartInfo.FileName = "cmd.exe"
    17. cmd.StartInfo.WorkingDirectory = ""
    18. cmd.StartInfo.CreateNoWindow = True
    19. cmd.StartInfo.UseShellExecute = False
    20. cmd.StartInfo.RedirectStandardOutput = True
    21. cmd.StartInfo.RedirectStandardInput = True
    22. cmd.StartInfo.StandardOutputEncoding = enc
    23. AddHandler cmd.OutputDataReceived, AddressOf WriteProcessOutput
    24. cmd.Start()
    25. cmd.BeginOutputReadLine()
    26. End Sub
    27. Private Sub WriteProcessOutput(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    28. If e.Data IsNot Nothing Then
    29. Me.Invoke(Sub() RichTextBox1.AppendText(e.Data & Environment.NewLine))
    30. End If
    31. End Sub
    32. End Class
    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!