process cmd.exe output to StringBuilder Encoding

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Nawiat.

    process cmd.exe output to StringBuilder Encoding

    Hallo,

    ich habe aktuell ein Problem was mich zur Verzweiflung bringt. Ich starte einen CMD Process welchen ich Befehle übergebe. Den Output der CMD hole ich mir async aus einen Handler und übergebe diesen. Ich bekomme auch alles schön zurück, aber im falschen Encoding. hat jemand eine Idee? Wahrscheinlich ist es nur was kleines. Hier ist aber erstmal der Code:

    Das ist die Funktion welche die CMD mit den Paramenten und co. aufruft:

    VB.NET-Quellcode

    1. Public processOutput As New StringBuilder
    2. Public Function RunCMDWithOutput(Pfad As String, command As String, arguments As String, permanent As Boolean)
    3. Dim RootDSE As New DirectoryServices.DirectoryEntry("LDAP://RootDSE")
    4. Dim DomainDN As String = RootDSE.Properties("DefaultNamingContext").Value
    5. Dim p As Process = New Process()
    6. Dim pi As ProcessStartInfo = New ProcessStartInfo()
    7. pi.Arguments = " " + If(permanent = True, "/K", "/C") + " " + command + " " + Pfad + " " + arguments
    8. pi.WorkingDirectory = "C:\Windows\System32"
    9. pi.FileName = "cmd.exe"
    10. pi.WindowStyle = ProcessWindowStyle.Hidden
    11. pi.CreateNoWindow = True
    12. pi.RedirectStandardOutput = True
    13. pi.StandardOutputEncoding = Encoding.UTF8
    14. Try
    15. Dim mystr As String = "ActiveDirectoryName\" & GUI.Benutzername
    16. Dim cut_at As String = "\"
    17. Dim x As Integer = InStr(mystr, cut_at)
    18. Dim string_after As String = mystr.Substring(x + cut_at.Length - 1)
    19. Dim mystr2 As String = DomainDN
    20. Dim cut_at2 As String = "DC="
    21. Dim x2 As Integer = InStr(mystr2, cut_at2)
    22. Dim string_after2 As String = mystr2.Substring(x2 + cut_at2.Length - 1)
    23. Dim s2 As String = string_after2
    24. Dim first2 As String
    25. Dim Index2 As String
    26. Index2 = s2.IndexOf("DC=")
    27. first2 = s2.Substring(0, Index2 - 1)
    28. pi.UserName = string_after & "@" & first2
    29. pi.PasswordInClearText = Decrypt(GUI.Passwort, GUI.PrivateKey)
    30. pi.UseShellExecute = False
    31. p.StartInfo = pi
    32. AddHandler p.OutputDataReceived, AddressOf OutputHandler
    33. p.Start()
    34. p.BeginOutputReadLine()
    35. p.WaitForExit()
    36. Application.DoEvents()
    37. If p.HasExited Then
    38. Return True
    39. End If
    40. Catch ex As Exception
    41. MsgBox(ex.Message)
    42. Return False
    43. End Try
    44. End Function


    Das ist der Handler welcher den StringBuilder befüllt:

    VB.NET-Quellcode

    1. Public Sub OutputHandler(sendingProcess As Object, outLine As DataReceivedEventArgs)
    2. ' Collect the sort command output.
    3. If Not String.IsNullOrEmpty(outLine.Data) Then
    4. ' Add the text to the collected output.
    5. MsgBox(outLine.Data)
    6. processOutput.AppendLine(outLine.Data)
    7. End If
    8. End Sub


    outLine.Data gibt mir Fragezeichen anstatt Sonderzeichen zurück. Ich habe auch schon versucht die Encodings zu konvertieren, aber alles ohne Erfolg.

    hier ist noch der Code womit ich die Function aufrufe:

    VB.NET-Quellcode

    1. If F.RunCMDWithOutput("""" & "PFAD ZU ORDNER" & """", "DIR /b", "", False) = True Then
    2. MsgBox("geht")
    3. MsgBox(F.processOutput.ToString)
    4. Else
    5. MsgBox("geht nicht")
    6. End If


    Vielen Dank vorab :)
    Versuchmal
    pi.StandardoutputEncoding = Encoding.GetEncoding(1252)

    Eventuell muss du noch das encoding registrieren wenn du deine Anwendung aufrufst. Das musst du aber nicht jedes Mal neu in der Function machen. Bzw. musst du den ganzen Prozess ja auch nicht jedesmal neu erstellen.
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
    @Nawiat getestet:

    VB.NET-Quellcode

    1. Dim enc = Encoding.GetEncoding(CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    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!