Lassen Sie uns zunächst überprüfen, was Folgendes rm -rf
bewirkt:
C:\Users\ohnob\things>touch stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>mkdir stuff.txt
C:\Users\ohnob\things>rm -rf stuff.txt
C:\Users\ohnob\things>ls -l
total 0
C:\Users\ohnob\things>rm -rf stuff.txt
Es gibt drei Szenarien, in denen rm -rf
häufig eine Rückkehr erwartet wird 0
:
- Der angegebene Pfad existiert nicht.
- Der angegebene Pfad existiert und ist ein Verzeichnis.
- Der angegebene Pfad existiert und ist eine Datei.
Ich werde die ganze Sache mit den Berechtigungen ignorieren, aber niemand verwendet Berechtigungen oder versucht, sich selbst den Schreibzugriff auf Dinge in Windows zu verweigern (OK, das soll ein Witz sein…).
Setzen SieERRORLEVEL
zuerst den Wert 0 und löschen Sie den Pfad nur dann, wenn er vorhanden ist. Verwenden Sie dabei unterschiedliche Befehle, je nachdem, ob es sich um ein Verzeichnis handelt oder nicht. IF EXIST
wird nicht ERRORLEVEL
auf 0 gesetzt , wenn der Pfad nicht vorhanden ist. Daher ERRORLEVEL
ist es erforderlich, zuerst 0 zu setzen, um den Erfolg auf eine Weise zu erkennen, die die normale rm -rf
Verwendung nachahmt . Das Bewachen des RD
with IF EXIST
ist erforderlich, da RD
im Gegensatz rm -f
dazu ein Fehler ausgegeben wird, wenn das Ziel nicht vorhanden ist.
Das folgende Skript-Snippet setzt voraus, dass DELPATH vorab in Anführungszeichen gesetzt ist. (Dies ist sicher , wenn Sie so etwas wie tun SET DELPATH=%1
. Versuchen Sie setzen ECHO %1
in ein .cmd
und es ein Argument mit Leerzeichen in es vorbei und sehen , was für sich selbst passiert). Nachdem das Snippet abgeschlossen ist, können Sie mit auf Fehler prüfen IF ERRORLEVEL 1
.
: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%
Der Punkt ist, dass alles einfacher ist, wenn die Umgebung nur POSIX entspricht. Oder wenn Sie ein minimales MSYS installieren und dieses einfach verwenden.