Wow, das ist der zweite Fall, in dem ich gesehen habe, wo ERRORLEVEL nicht richtig eingestellt ist! Siehe File redirection in Windows and %errorlevel%.
Die Lösung ist die gleiche wie beim Erkennen eines Umleitungsfehlers. Verwenden Sie den Operator ||
, um bei einem Fehler Maßnahmen zu ergreifen.
rd testdir || echo The command failed!
Die bizarre Sache ist, wenn Sie den ||
Operator verwenden, die Error-dann richtig auf 145 gesetzt, wenn der Ordner nicht leer war, oder 2, wenn der Ordner nicht existiert. Du musst also gar nichts machen. Sie können eine Bemerkung bedingt "ausführen", und der errorlevel wird dann richtig gesetzt.
rd testdir || rem
echo %errorlevel%
aktualisiert 2016.01.21
Bereits im April 2015, behauptete Andreas Vergison in einem Kommentar, dass ||
nicht die Error-für "Zugriff verweigert" gesetzt hat, oder“... In Verwenden Sie ... "Fehler. Ich hatte Windows 7 zu der Zeit, und ich glaube nicht, dass ich seinen Anspruch verifiziert habe, sondern nur angenommen habe, dass er Recht hatte. Aber ich habe kürzlich in Windows 10 getestet, und die ||
setzt immer das ERRORLEVEL bei Fehler auf Null. Beachten Sie, dass (call)
eine arkane Art ist, das ERRORLEVEL auf 0 zu setzen, bevor ich jeden Befehl ausführe. Beachten Sie auch, dass meine cmd.exe-Sitzung die verzögerte Erweiterung aktiviert hat.
C:\test>(call) & rd junk && echo OK || echo ERROR !errorlevel!
Access is denied.
ERROR 5
C:\test>(call) & rd test && echo OK || echo ERROR !errorlevel!
The directory is not empty.
ERROR 145
C:\test>(call) & rd \test && echo OK || echo ERROR !errorlevel!
The process cannot access the file because it is being used by another process.
ERROR 32
C:\test>(call) & rd notExists && echo OK || echo ERROR !errorlevel!
The system cannot find the file specified.
ERROR 2
Nun, das hat gerade funktioniert. Ich nehme an, das Problem hängt mit '% errorlevel%' zusammen und hat nichts mit 'rd' zu tun. Ich denke, ich sollte meine Fehlerbehandlungen neu schreiben, indem ich diese Struktur für ein deterministischeres Verhalten verwende. Vielen Dank! – etuardu
Dies funktioniert gut für die Codes 2 und 145, aber im Falle von "Zugriff verweigert" oder "Der Prozess kann nicht auf die Datei zugreifen, weil es von einem anderen Prozess verwendet wird", bleibt ERRORLEVEL unverändert. :( –
@AndreasVergison - Danke! Ich aktualisierte meine Antwort mit Ihrer Info. – dbenham