von cmd.exe/Diskpart.exe stderr abrufen

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    von cmd.exe/Diskpart.exe stderr abrufen

    Hi liebe Community,

    zunächst erstmal mein Vorhaben:

    Ich möchte mit Diskpart.exe einen Datenträger formatieren und mitbekommen, wenn ein Fehler dabei aufgetreten ist.

    Momentan mache ich es wie folgt:

    VB.NET-Quellcode

    1. Try
    2. Dim p As Process = New Process()
    3. Dim pInfo As ProcessStartInfo = New ProcessStartInfo()
    4. pInfo.FileName = "diskpart.exe"
    5. pInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System)
    6. pInfo.RedirectStandardInput = True
    7. pInfo.RedirectStandardOutput = True
    8. pInfo.RedirectStandardError = True
    9. pInfo.UseShellExecute = False
    10. pInfo.CreateNoWindow = True
    11. p.StartInfo = pInfo
    12. p.Start()
    13. p.StandardInput.WriteLine("select disk " + PhysicalDrive)
    14. p.StandardInput.Flush()
    15. p.StandardInput.WriteLine("clean")
    16. p.StandardInput.Flush()
    17. p.StandardInput.WriteLine("create partition primary")
    18. p.StandardInput.Flush()
    19. p.StandardInput.WriteLine("select partition 1")
    20. p.StandardInput.Flush()
    21. p.StandardInput.WriteLine("active")
    22. p.StandardInput.Flush()
    23. p.StandardInput.WriteLine("assign letter= " + DriveLetter)
    24. p.StandardInput.Flush()
    25. p.StandardInput.WriteLine("format fs=NTFS Label=USB-Disk quick")
    26. p.StandardInput.Flush()
    27. p.StandardInput.WriteLine("exit")
    28. p.StandardInput.Flush()
    29. p.WaitForExit()
    30. Dim exitCode As Integer = p.ExitCode
    31. If p.StandardError.Peek > 0 Then
    32. MessageBox.Show("Es ist ein Fehler aufgetreten!")
    33. End If
    34. Catch ex as Exception
    35. End Try


    EDIT:

    VB.NET-Quellcode

    1. Private Sub p_ErrorDataReceived(sender As Object, e As System.Diagnostics.DataReceivedEventArgs) Handles p.ErrorDataReceived
    2. MsgBox(e.Data) 'bekomme hier ebenfalls keine Meldung
    3. End Sub


    Der Vorgang an sich funktioniert.

    Wenn ich jetzt aber z.B. während der Formatierung den USB-Stick entferne, habe ich folgendes Problem:
    Der ExitCode ist immer 0, egal ob ein Fehler aufgetreten ist, oder nicht.
    Bei der Abfrage If p.StandardError.Peek > 0 Then bleibt die Anwendung dort stehen und wartet (wahrscheinlich, weil es keine Daten im stderr gibt).

    Ich möchte nicht den stdout prüfen, denn andere Systemsprachen = andere Outputs...


    Wie könnteich sonst noch abfragen, ob fehler aufgetreten sind?

    Besten Dank für Eure Antworten :)

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

    Du kannst ja diskpart auch mit einer script datei aufrufen mit diskpart /s Skriptname.txt.

    Kannst ja mal probieren die txt datei iwo dynamisch in nem temp ordner zu erstellen und dann diskpart damit aufzurufen und schauen ob du da vll einen anderen exitcode bekommst?
    Das ist meine Signatur und sie wird wunderbar sein!
    Hey das hat funktioniert, Danke!
    Habe ich anscheinend in der Dokumentation überlesen :whistling:

    Wobei ich es blöd finde, dafür extra ein Skript zu erstellen, wenn ich die Daten direkt zum Prozess schicken kann...aber nunja, so geht's eben anscheinend nicht.

    Ist das "normal", dass der Prozess (in meinem Fall Diskpart) nix über stderr schreibt? ?(
    Dafür ist ja eigentlich der stderr da :D

    Was ich mit dem Skript dennoch nicht mitbekomme ist, wo genau der Fehler aufgetreten ist.
    Das hab ich mir ja durch den stderr erhofft, denn nach jedem Befehl könnte ich diesen abfragen.

    Aber wenn er leer ist, bringt's mir auch nix :D