722 Stimmen

Äquivalent zu "rm -rf" für Windows?

Ich benötige eine Möglichkeit, einen Ordner und seine Unterordner rekursiv zu löschen.

Gibt es dafür ein vorgefertigtes Tool, oder muss ich eines schreiben?

DEL /S löscht keine Verzeichnisse.

DELTREE wurde aus Windows 2000+ entfernt

7voto

Branan Punkte 1791

rmdir /S /Q %DIRNAME%

5voto

BananaAcid Punkte 2830

Als Sidenode:

Von der Linux-Version mit allen Unterverzeichnissen (rekursiv) + Löschen erzwingen

$ rm -rf ./path

zur PowerShell

PS> rm -r -fo ./path

die fast die gleichen Parameter hat (nur getrennt) (-fo wird benötigt, da -f mit verschiedenen anderen Parametern übereinstimmen könnte)

Anmerkung:

Remove-Item ALIASE
    ri
    rm
    rmdir
    del
    erase
    rd

5voto

jianyongli Punkte 831

In der Powershell ist rm ein Alias von Remove-Item so entfernen Sie eine Datei,

rm -R -Fo the_file

ist gleichbedeutend mit

Remove-Item -R -Fo the_file

wenn Sie sich mit Gnu wohl fühlen rm nutzen, können Sie die rm verwendet von choco Paketmanager unter Windows.

gnu utils in powershell installieren mit choco :

choco install GnuWin

endlich,

rm.exe -rf the_file

4voto

binki Punkte 6868

Zunächst sollten wir uns ansehen, was rm -rf tut:

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 wird üblicherweise verwendet, wenn erwartet wird, dass es 0 :

  1. Der angegebene Pfad existiert nicht.
  2. Der angegebene Pfad existiert und ist ein Verzeichnis.
  3. Der angegebene Pfad existiert und ist eine Datei.

Ich werde die ganze Sache mit den Zugriffsrechten ignorieren, aber niemand verwendet Zugriffsrechte oder versucht, sich selbst den Schreibzugriff auf Dinge in Windows zu verweigern (OK, das sollte ein Witz sein ).

Erste einstellen. ERRORLEVEL auf 0 und löschen Sie den Pfad nur, wenn er existiert, wobei unterschiedliche Befehle verwendet werden, je nachdem, ob es sich um ein Verzeichnis handelt oder nicht. IF EXIST setzt nicht ERRORLEVEL auf 0 gesetzt, wenn der Pfad nicht existiert, so dass das Setzen des ERRORLEVEL auf 0 zu setzen, ist notwendig, um den Erfolg auf eine Art und Weise zu erkennen, die den normalen Zustand nachahmt. rm -rf Verwendung. Die Bewachung der RD con IF EXIST ist notwendig, weil RD im Gegensatz zu rm -f gibt einen Fehler aus, wenn das Ziel nicht existiert.

Der folgende Skriptausschnitt geht davon aus, dass DELPATH in Anführungszeichen gesetzt ist. (Dies ist sicher, wenn Sie etwas tun wie SET DELPATH=%1 . Versuchen Sie, die ECHO %1 in einem .cmd und übergeben Sie ihm ein Argument mit Leerzeichen und sehen Sie selbst, was passiert). Nachdem das Snippet abgeschlossen ist, können Sie den Fehler mit 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 einfach mit POSIX konform ist. Oder wenn Sie ein minimales MSYS installieren und nur dieses verwenden.

4voto

faester Punkte 14508

In Powershell rm -recurse -force funktioniert recht gut.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X