Prozess Error auslesen

  • VB.NET

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

    Prozess Error auslesen

    Hallo liebes Forum ich melde mich nochmal mti einem kleinen Problem :P

    Ich versuche schon seit Stunden ne Lösung zu finden aber bisher alles ohne Ergebnis.
    Und zwar starte ich ein Kommandozeilen Programm und lass mir den Output/ErrorOutput auslesen und anzeigen.

    Mit dem Code hier:

    VB.NET-Quellcode

    1. Private Sub ExtractWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles ExtractWorker.DoWork
    2. Me.UseWaitCursor = True
    3. Dim RAR As Process = New Process
    4. Dim RARInfo As New ProcessStartInfo
    5. Dim Encoding As System.Text.Encoding
    6. Encoding = System.Text.Encoding.GetEncoding(Globalization.CultureInfo.CurrentUICulture.TextInfo.OEMCodePage)
    7. RAR.StartInfo = RARInfo
    8. RAR.EnableRaisingEvents = True
    9. RARInfo.FileName = RARPath
    10. RARInfo.WindowStyle = ProcessWindowStyle.Hidden
    11. RARInfo.UseShellExecute = False
    12. RARInfo.RedirectStandardError = True
    13. RARInfo.RedirectStandardOutput = True
    14. RARInfo.CreateNoWindow = True
    15. RARInfo.Arguments = "x -o+ " & CurrentFile & " " & SavePath
    16. RARInfo.StandardOutputEncoding = Encoding
    17. AddHandler RAR.ErrorDataReceived, AddressOf Async_Data_Received
    18. AddHandler RAR.OutputDataReceived, AddressOf Async_Data_Received
    19. RAR.Start()
    20. RAR.BeginErrorReadLine()
    21. RAR.BeginOutputReadLine()
    22. RAR.WaitForExit()
    23. RAR.Dispose()
    24. RAR.Close()
    25. End Sub


    Problem ist mit den Argumenten gebe ich an eine RAR Datei zu entpacken, doch wenn diese ein Passwort enthält dann kommt ein Error als Ergebnis mit dem Inhalt "Enter password ... .... ..."
    Aber der Error geht nur durch wenn der ganze Prozess geschlossen wird vorher nicht.
    Also wie kann ich wenn der Fehler auftritt den Prozess schliessen und mir eine Messagebox anzeigen lassen die mir zb sagt das ein Passwort vorhanden ist.

    Nach langer suche auf Google hab ich leider keine möglichkeit gefunden den Error auszulesen bevor der Prozess geschlossen wird, vllt hat da jemand ne Idee.
    Danke im voraus.
    @Gutserino Im Excited-Event kannst Du den ExitCode des Prozesses auslesen, wenn Du das meinst.
    docs.microsoft.com/de-de/dotne…ted?view=netframework-4.8
    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!
    Etwas dergleichen mein ich gestern probiert zu haben, das Exited Event wird aber doch nur ausgelöst wenn der Prozess geschlossen wird ?
    Problem ist ja das wenn der oben genannte Fehler kommt schliesst sich das Programm ja nicht, es bleibt weiter offen bis man es selbst schliesst, und dann wird erst ein Error Result ausgeworfen.

    Gutserino schrieb:

    das Exited Event wird aber doch nur ausgelöst wenn der Prozess geschlossen wird ?
    Ja. Und nur da kannst Du diesen Fehler abfragen.
    Im Prinzip der Return-Wert einer Batch-Datei.
    Der StandardError-Stream ist da was anderes, da hab ich mal n Beispiel gemacht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private WithEvents cmd As Process = New Process()
    4. Private sw As System.IO.StreamWriter = Nothing
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. cmd.StartInfo.ErrorDialog = True
    7. cmd.StartInfo.UseShellExecute = False
    8. cmd.StartInfo.RedirectStandardInput = True
    9. cmd.StartInfo.RedirectStandardOutput = True
    10. cmd.StartInfo.RedirectStandardError = True
    11. cmd.StartInfo.FileName = "cmd.exe"
    12. 'cmd.StartInfo.CreateNoWindow = True
    13. cmd.StartInfo.StandardOutputEncoding = System.Text.Encoding.Default
    14. cmd.Start()
    15. sw = cmd.StandardInput
    16. cmd.BeginOutputReadLine()
    17. cmd.StandardInput.Write("chdir C:\Temp\Test" & Environment.NewLine)
    18. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    19. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    20. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    21. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    22. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    23. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    24. cmd.StandardInput.Write("cd .." & Environment.NewLine)
    25. cmd.StandardInput.Write("cd Temp" & Environment.NewLine)
    26. cmd.StandardInput.Write("dir " & Environment.NewLine)
    27. End Sub
    28. Private Sub cmdHandler(ByVal sendingProcess As Object, ByVal outLine As DataReceivedEventArgs) Handles cmd.OutputDataReceived
    29. If Not String.IsNullOrEmpty(outLine.Data) Then
    30. Me.Invoke(Sub() Me.TextBox1.AppendText(Environment.NewLine & outLine.Data))
    31. End If
    32. End Sub
    33. Private Sub cmdHandler2(ByVal sendingProcess As Object, ByVal outLine As DataReceivedEventArgs) Handles cmd.ErrorDataReceived
    34. If Not String.IsNullOrEmpty(outLine.Data) Then
    35. Me.Invoke(Sub() Me.TextBox2.AppendText(Environment.NewLine & outLine.Data))
    36. End If
    37. End Sub
    38. Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    39. Try
    40. If cmd IsNot Nothing Then
    41. cmd.StandardInput.Flush()
    42. cmd.StandardInput.Close()
    43. cmd.CancelOutputRead()
    44. cmd.Close()
    45. End If
    46. Catch
    47. End Try
    48. End Sub
    49. 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!
    So ziehmlich wie bei RodFromGermany in seinem Beispiel

    VB.NET-Quellcode

    1. Private Sub Async_Data_Received(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
    2. If Not String.IsNullOrEmpty(e.Data) Then
    3. Me.Invoke(Sub() RichTextBox1.AppendText(e.Data & Environment.NewLine))
    4. End If
    5. End Sub


    Vollzitat entfernt. ~Thunderbolt

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

    Boah, WinRAR scheint da echt tricky zu sein. Da kommen (bei mir) keine Fehlermeldungen. Ist ja nur ne Passwort-Eingabeaufforderung. Und abhängig davon, ob ich den Parameter ierr setze, kommt entweder Alles ok oder Keine Dateien zum Entpacken.. Aber nie so, dass man es sinnvoll auswerten kann. Ich habe es mal anders gemacht: Asynchron* ausführen und warten, ob es selber fertig wird oder nach 5 Sekunden immer noch läuft. Zwar alles Pfeil-Rücken-Brust-Auge, aber es scheint erstmal zu klappen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Public Class FrmMain
    3. Dim RAR As Process = New Process
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. TryToUnpackArchive()
    6. End Sub
    7. Private Async Sub TryToUnpackArchive()
    8. Dim RARInfo As New ProcessStartInfo
    9. RAR.StartInfo = RARInfo
    10. RARInfo.FileName = "C:\Program Files\WinRAR\rar.exe"
    11. RARInfo.WindowStyle = ProcessWindowStyle.Hidden
    12. RARInfo.UseShellExecute = False
    13. RARInfo.CreateNoWindow = True
    14. RARInfo.Arguments = "x -o+ D:\PrimeGen.rar D:\"
    15. Await Threading.Tasks.Task.Run(Sub() WaitForUnpacking())
    16. RAR.Close()
    17. RAR.Dispose()
    18. Me.Close()
    19. End Sub
    20. Private Sub WaitForUnpacking()
    21. Dim CriticalTask = Threading.Tasks.Task.Run(Sub() Unpack())
    22. Dim IsDone = CriticalTask.Wait(5000)
    23. If Not IsDone Then MessageBox.Show("Das Entpacken scheitert wohl am Warten auf ein Passwort.")
    24. End Sub
    25. Private Sub Unpack()
    26. RAR.Start()
    27. RAR.WaitForExit()
    28. End Sub
    29. End Class



    Post#1, Zeile#23-#24: Dispose vor Close? Nuja, wenn das mal nicht hochgeht

    * und zwar ohne Backgroundworker; Stichwort Async/Await
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ​If you omit the password in the command line, you will be prompted to enter it
    Was, wenn du mittels -pein leeres Passwort mitgibst?
    Dann müsste er unverschlüsselte Archive entpacken und verschlüsselte mit Fehlermeldung zurückweisen.

    Ich würd's ja selbst testen, aber ich möchte hier kein WinRar installieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Ich hab was. Wenn du einfach -password mitschickst, bekommst du wenn ein Passwort gesetzt ist, es aber nicht stimmt eine Fehlermeldung(wir haben ja keins mitgeschickt), ist keins gesetzt(Archiv) wird entpackt, trotz -password ohne Passwort-Angabe. Die Authoren haben die Hilfe der RAR exe wohl nicht mehr geupdatet. :thumbdown: Wird nicht mal angezeigt in der Hilfe ;( :evil: . Da muss man erst rumprobieren und im Netz suchen.

    VB.NET-Quellcode

    1. RARInfo.Arguments = "x -password -o ""source.rar"" ""target"""

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „NoIde“ ()

    -p steht auch in der Hilfe. rar.exe -? Das hat rarlabs aber echt versaut.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

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

    Danke für die vielen Lösungen, hab nach ner Weile nen Command gefunden das ich so in der rar Datei nicht gefunden hab.
    "rar vt datei.rar" Damit überprüft er die Datei und wenn ein Passwort vorhanden ist gibt er aus als "Flags: encrypted".