locked
Diskpart mit skript schlägt fehl, trotzdem Errorlevel 0? RRS feed

  • Frage

  • Hallo,

     

    ich verwende under Windows PE ein diskpart skript in einem batch um bei einer automatischen Installation die Partionierung vorzunehmen. Das funktioniert auch ganz gut. Wenn aber die Festplatte zu klein ist um die Partitionen mit der im Skript festgelegten Größe anzulegen, schlägt das natürlich fehl. Leider ist der Errorlevel den diskpart in dem Fall zurück gibt aber trotzdem 0. Dadurch kann ich diesen Fall im batch nicht abfangen.

    Diskpart selbst merkt natürlich, dass diese Partition nicht angelegt werden kann und macht entsprechende Ausgaben, die in meinem Fall in einem logfile landen. Schade nur, dass der Errorlevel nicht mitteilt, wenn das skript fehlschlägt.

    Gibt es eine Lösung dafür, außer nach diskpart im batch zu prüfen, ob die Laufwerksbuchstaben tatsächlich angelegt wurden?

     

    Viele Grüße

     Mirko

    • Verschoben Alex Pitulice Donnerstag, 31. Januar 2013 21:23 Zusammenführung Plan
    Donnerstag, 28. Juli 2011 10:45

Antworten

  • Du scheiterst daran, daß Diskpart keinen konventionellen Errorlevel
    liefert, sondern den hexadezimalen Winerror - z.B. 0x8007005. Und das
    evaluiert dann zu -2147024809. Bin mir nicht ganz sicher, ob negative
    Zahlen überhaupt zulässig sind, aber auf jeden Fall ist das kleiner als 1 :)
     
    Stell auf "if %errorlevel% NEQ 0" um, das geht.
     
    mfg Martin
     

    A bissle "Experience", a bissle GMV...
    • Als Antwort vorgeschlagen Michael Bormann Freitag, 29. Juli 2011 16:59
    • Als Antwort markiert Losmirkos Montag, 1. August 2011 07:52
    Freitag, 29. Juli 2011 13:48

Alle Antworten

  • Hallo Mirko,

    In der entsprechenden Batch fragt man nicht auf 0 sondern höher 0 ab

    If errorlevel 1 goto fehler

    echo - geklappt

    goto end

    :fehler

    Echo - klappt nicht

    :end

    ----------------

    If errorlevel == 1 goto fehler1

    ^^^^^^^^^^^ da wird explizit auf 1 abgefragt und auch so behandelt, das erste Beispiel wirft alles >= 1 als Treffer aus, das nimmst du für deine Batch.


    mfg Michael | www.mbormann.de
    Donnerstag, 28. Juli 2011 11:28
  • Hallo,

     

    genau so mache ich es auch, hier die zwei Zeilen aus meinem Batch:

    diskpart /s prepare_hdd.txt > x:\diskpart.log
    if errorlevel 1 goto diskpart_problem

    Das Problem ist, dass diskpart keinen errorlevel > 0 liefert, wenn das Skript zwar korrekt ist aber fehlschlägt.

     

    Any ideas?

     

    Ciao

     Mirko

    Donnerstag, 28. Juli 2011 12:00
  • Hallo Mirko,

     

    mir scheint des Rätsels Lösung ist "noerr" - damit wird jeglicher Fehler ignoriert und Diskpart wird dir immer 0 als Errorlevel bringen

    Zumindest meine ich die Beschreibung so aufgefasst zu haben.

     

    noerr

    Nur für Skripting. Gibt an, dass DiskPart beim Auftreten eines Fehlers Befehle weiter so verarbeitet, als ob kein Fehler aufgetreten wäre. Ohne den Parameter noerr wird DiskPart beim Auftreten eines Fehlers mit einem Fehlercode beendet.

     

    Gruss

    Michael


    mfg Michael | www.mbormann.de
    Donnerstag, 28. Juli 2011 17:15
  • Hallo Michael,

     

    das wäre tatsächlich eine plausible Erklärung - Wenn ich denn den Parameter noerr verwenden würde. Aber da ich ja möchte, dass Fehler bemerkt werden tue ich das nicht.

     

    Ciao

     Mirko

     

    Freitag, 29. Juli 2011 05:54
  • Hallo Mirko,

    > Wenn ich denn den Parameter noerr verwenden würde.

    OH, dann stellt sich die Frage ob es ein Problem mit Diskpart selbst ist - welche Version?

    oder die Umleitung. Allerdings müssten sich erheblich mehr darüber ausgelassen haben, wäre das so.

    Kann es leider derzeit nicht austesten, evtl. hat einer der Mitleser eine Idee.


    mfg Michael | www.mbormann.de
    Freitag, 29. Juli 2011 11:06
  • Hallo,

     

    ich verwende "Microsoft DiskPart version 6.1.7600" aus einer Win PE Umgebung.

     

    Ciao

     Mirko

    Freitag, 29. Juli 2011 11:35
  • Du scheiterst daran, daß Diskpart keinen konventionellen Errorlevel
    liefert, sondern den hexadezimalen Winerror - z.B. 0x8007005. Und das
    evaluiert dann zu -2147024809. Bin mir nicht ganz sicher, ob negative
    Zahlen überhaupt zulässig sind, aber auf jeden Fall ist das kleiner als 1 :)
     
    Stell auf "if %errorlevel% NEQ 0" um, das geht.
     
    mfg Martin
     

    A bissle "Experience", a bissle GMV...
    • Als Antwort vorgeschlagen Michael Bormann Freitag, 29. Juli 2011 16:59
    • Als Antwort markiert Losmirkos Montag, 1. August 2011 07:52
    Freitag, 29. Juli 2011 13:48
  •  
    Stell auf "if %errorlevel% NEQ 0" um, das geht.
     


    Geht in jedem Fall, der zurückgegebene %Errorlevel% ist in der Tat im Fehlerfall kleiner Null.

    Passt also perfekt.


    mfg Michael | www.mbormann.de
    Freitag, 29. Juli 2011 16:59
  • Guten Montag,

     

    habs ausprobiert und funktioniert. Die Frage ist nur: Was soll das? Warum liefert Diskpart einen negativen Errorlevel, im Kontrast zu allen anderen Kommandozeilentools die mir bekannt sind? Und: warum ist das nicht dokumentiert? z.B. hier: http://support.microsoft.com/kb/300415/de

     

    Ciao

     Mirko

    Montag, 1. August 2011 07:54
  • > Warum liefert Diskpart einen negativen Errorlevel, im Kontrast zu allen
     
    Tut es nicht - es liefert einen 32 Bit UNSIGNED Integer Errorlevel
    (guckst Du z.B. mal hier:
    diesen Range nicht als RC verarbeiten, da hier 32 Bit SIGNED Integer
    verwendet wird - es kommt zu einem Überlauf und die Zahl wird negativ.
     
    > anderen Kommandozeilentools die mir bekannt sind? Und: warum ist das
    > nicht dokumentiert? z.B. hier: http://support.microsoft.com/kb/300415/de
     
    Der Artikel ist noch für XP...
     
    mfg Martin
     

    A bissle "Experience", a bissle GMV...
    Montag, 1. August 2011 08:11
  • Hallo,

     

    Hmm, für mich bleiben trotzdem Fragen offen:

    - warum produziert ein commandline tool einen return wert, den cmd nicht verarbeiten kann?

    - hat sich diskpart unter XP schon so verhalten? Warum ist das nicht dokumentiert?

    - gibt es eine neue Doku für diskpart unter Win 7? Ich hab keine gefunden... Ist das da dokumentiert?

    - Die diskpart doku listet ja eine ganze Reihe von errorlevels auf. Warum diesen nicht?

     

    Also, für mich ist das ein bug. Andere User werden genauso drüber stolpern wie ich, denn es gibt keine Dokumentation darüber und diskpart verhält sich anders als alle commandline tools die mir bekannt sind.

    Wo kann man sowas reporten?

     

    Ciao

     Mirko

    Montag, 1. August 2011 08:40
  • Hallo, Mirko.
     
    > - warum produziert ein commandline tool einen return wert, den cmd nicht
    > verarbeiten kann?
     
    Weil man's auch aus VBS oder PS1 aufrufen kann, und da geht das mit 32
    Bit RCs wunderbar.
     
    > - hat sich diskpart unter XP schon so verhalten? Warum ist das nicht
    > dokumentiert?
     
    Nein, da kommen die im 300415 dokumentierten RCs - aber die sind für ein
    anständiges Errorhandling nicht ausreichen.
     
    > - gibt es eine neue Doku für diskpart unter Win 7? Ich hab keine
    > gefunden... Ist das da dokumentiert?
     
    Ich hab auch nix gefunden. Aber in winerror.h sind die RCs alle drin.
    Und damit dann auch z.B. mit winerror.exe (SDK) oder err.exe
    leicht auswertbar.
     
    > - Die diskpart doku listet ja eine ganze Reihe von errorlevels auf.
    > Warum diesen nicht?
     
    S.o. - galt für XP.
     
    > Also, für mich ist das ein bug. Andere User werden genauso drüber
     
    Nein, kein Bug. Definitiv "Feature", nur daß es nicht dokumentiert
    wurde, ist etwas ärgerlich.
     
    mfg Martin
     

    A bissle "Experience", a bissle GMV...
    Montag, 1. August 2011 11:04