Löschen Sie einen Ordner in Windows vollständig über die Befehlszeile

57

Ich muss einen Ordner löschen, der andere Ordner und Dateien enthält. Ich habe versucht delund rmdirBefehle, aber manchmal scheitern sie mit einigen Fehlerzeilen:[PATH]: The directory isn't empty.

Gibt es eine gute Alternative?

Francesco Zanini
quelle
Ich habe Inkonsistenzen darin erfahren, ob rmdir mit entsprechenden Flags alles in einem Verzeichnisbaum (und / oder dem Baum selbst) entfernt, und die einzige mögliche Erklärung, die ich habe, ist, was Harry Johnston sagt.
r_alex_hall

Antworten:

15

Das passiert mir oft mit meinen automatisierten Build-Skripten.

Ich denke, der Grund könnte eine Anwendung sein, in der eine Datei mit "share delete" in diesem Verzeichnis geöffnet ist. Dh die Anwendung erlaubt das Löschen der Datei (weshalb der DeleteFile-Aufruf meines Erachtens nicht fehlschlägt), aber die Datei verschwindet erst, nachdem die Anwendung ihr Handle geschlossen hat.

Das bedeutet, dass die Datei möglicherweise noch vorhanden ist, wenn der rmdirBefehl versucht, den Ordner zu löschen, daher die Fehlermeldung. Kurz danach schließt die Anwendung das Handle, die Datei verschwindet und wenn Sie den Ordner überprüfen, um festzustellen, von welcher Datei rmdirdie Rede war, ist sie leer.

Zumindest ist das meine Theorie.

Die von Harry Johnston vorgeschlagene Problemumgehung sieht gut aus. Nur ich würde eine Pause zwischen den rmdirBefehlen einfügen . Natürlich hat Windows keinen leicht skriptfähigen "Pause" -Befehl (Korrektur: Alte Windows-Versionen haben das nicht, neuere - siehe Kommentare). Wenn jedoch die Granularität von Sekunden ausreicht, kann pingeine Pause erstellt werden:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

Also insgesamt:

rd /s /q foo
:: retry once
if exist foo (
    :: clear errorlevel
    cmd /c
    :: pause
    ping -n 2 127.0.0.1 >nul
    :: retry
    rd /s /q foo
)
:: retry yet again
if exist foo (
    cmd /c
    ping -n 2 127.0.0.1 >nul
    rd /s /q foo
)
:: give up
if exist foo {panic}
Paul Groke
quelle
Nach meiner Erfahrung ist eine Pause nie notwendig, aber YMMV. (Wenn wirklich eine andere Anwendung im Spiel ist, ist es natürlich vorzuziehen, sie zu identifizieren und explizit darauf zu warten, dass sie nach Möglichkeit beendet wird.)
Harry Johnston,
Nun ... Ich habe eine 10-fache Wiederholungsschleife mit einer Sekunde Verzögerung pro Wiederholung implementiert. Funktioniert jetzt. Ich werde nicht versuchen, die Pause zu entfernen, nur um zu sehen, dass sie erneut fehlschlägt :-) Natürlich heißt das nicht, dass es notwendig ist. Ich bin nur sehr vorsichtig.
Paul Groke
2
OT: Deshalb hasse ich Fenster. Alles ist so schwer. rm -rf /directory/sollte auf allen Betriebssystemen global sein.
2
Es gibt tatsächlich eine Art "Pause" -Befehl; timeout /t 3
Um
@r_alex_hall In der Tat (aber nativ nur ab Vista, XP und früher haben den pauseBefehl nicht).
Mischa256
57

Versuchen:

rmdir /S your_directory

oder:

rmdir /S /Q your_directory 

um Bestätigungsnachrichten zu überspringen.

AndrewQ
quelle
1
Ich habe diese Optionen bereits ausprobiert, aber als ich schrieb delund rmdirnichts fragte, sendeten sie nur einige Zeilen wie die in der Beschreibung.
Francesco Zanini
2
rmdir /slöscht alles, was gelöscht werden kann. Möglicherweise verfügen Sie über Dateien, die von einem Programm gesperrt wurden, schreibgeschützte Dateien oder Dateien, für deren Löschen Sie Administratorrechte benötigen. Es gibt keinen einzigen Befehl, der all diese Situationen für Sie
regelt
Wenn weiterhin Fehlermeldungen angezeigt werden, versuchen Sie es mit PowerShell: Das Cmdlet Remove-Item ist etwas leistungsfähiger als rmdir.
AndrewQ
1
rmdir / S <Verzeichnis> Löscht Verzeichnis, Unterordner und Verzeichnisse. Sie werden auch gefragt, ob Sie sicher sind. Unter Windows 10. Vielen Dank
Jasmeet
1
@r_alex_hall RMDIR / s löscht tatsächlich Dateien in Verzeichnissen. DEL / s löscht jedoch nur die Dateien und behält die Verzeichnisse, weshalb RMDIR die bessere Option ist
JCH2k
11

Möglicherweise verfügen Sie über schreibgeschützte Dateien. Sie können die Option del / F verwenden, um sie mithilfe von zu entfernen

     del /S /F your_directory
     rmdir your_directory

Sie könnten auch versteckte Dateien haben und wenn Sie wirklich sicher sind, dass Sie diese löschen möchten, können Sie dies mit tun

     del /S /F /AH your_directory
     rmdir your_directory

Wenn dies weiterhin fehlschlägt, haben Sie entweder keine Berechtigung zum Löschen einiger Dateien, oder einige der Dateien werden noch verwendet.

sgmoore
quelle
Das sollte die richtige Antwort sein!
JDHAO
4

Ich glaube, es gibt einen Fehler in Windows 7 (und möglicherweise in anderen Versionen), der manchmal dieses Symptom verursacht. oder es könnte ein Fehler in Software von Drittanbietern sein. (Haben Sie Symantec Endpoint Protection zufällig installiert?)

Jedenfalls bin ich ziemlich oft darauf gestoßen. In den meisten Fällen kann das Problem durch rd /s /qzwei- oder dreimaliges Ausführen in Folge behoben werden.

Wenn dies in einer Batch-Datei ist, können Sie so etwas tun:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Harry Johnston
quelle
Einverstanden. Wenn Sie rd / s foo verwenden, dh ohne die Option / q silent, werden alle Unterordner für Sie gelöscht. Sie müssen jedoch auf die Eingabeaufforderung mit Y antworten, sodass Batchdateien überwacht werden müssen. Weniger als ideal, weiß ich.
Anthony
3

Verwenden Sie delfür die Dateien im Inneren, rmdirum den Ordner zu entfernen.

Um die rmdirMethode auch zum Entfernen aller Dateien zu verwenden, verwenden Sie die /SOption vor dem Verzeichnisnamen und /Qunterdrücken Sie die Aufforderung zum Löschen. Dies ist der beste Weg, da Sie keinerlei Dateien verpassen. Seien Sie jedoch vorsichtig bei der Verwendung der Option / Q, da Sie sonst nicht vor System- oder versteckten Dateiattributen gewarnt werden

Der Kanadier Luke REINSTATE MONICA
quelle
2

Wenn Sie node verwenden , können Sie die rimraf- Abhängigkeit folgendermaßen verwenden:

Führen Sie install aus: npm install rimraf -g

lösche Ordner: rimraf SourceFolder

Dies hat mir geholfen, als ich den Fehler erhielt:

Die Namen der Quelldateien sind größer als vom Dateisystem unterstützt

Dustin Spengler
quelle
0

Ordner ältere Versionen von Windows (DOS, Windows 95/98 / ME), DELTREEentspricht RModer RMDIR. Ich verwende DELTREEauf meiner Windows 7-Workstation in Batch-Dateien nur in Ordnung.

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Sonne
quelle
0

Ich denke, Sie können es so verwenden:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"
Shubham Dwivedi
quelle
1
Willkommen in SU! Warum habe ich downgestimmt? 1) Schlechte Formatierung 2) Bietet die gleiche grundlegende Lösung, die bereits vor einigen Jahren veröffentlicht wurde (lesen Sie immer die veröffentlichten Lösungen, bevor Sie eine neue veröffentlichen!) 3) Ist für die Frage nicht geeignet (Ihre Lösung erstellt den gelöschten Ordner neu, der wurde nicht gefragt).
Zagrimsan