Wie lösche ich Verzeichnisbäume über eine Batch-Datei unter Windows 7?

36

Ich möchte den gesamten Inhalt eines bestimmten Ordners unter Windows 7 über eine Batch-Datei löschen. Mein Problem ist, dass "del" oder "erase" nur die Dateien löscht, nicht die Ordner und "rmdir" oder "rd" immer den angegebenen Ordner mit seinem Inhalt löscht, aber ich möchte nur den Inhalt löschen, nicht den Ordner selbst . Ich habe den Befehl ' rmdir /S /Q "C:\Share\*"' ausprobiert , wodurch ich einen Syntaxfehler bekam.

Was ist der richtige Weg, um dies zu tun?

Ich arbeite unter Windows 7 Professional 64-Bit und habe Administratorrechte.

Michael K
quelle

Antworten:

36

Ihre Batch-Datei muss zwei Befehle ausführen, einen zum Löschen der Dateien und einen zum Entfernen der untergeordneten Verzeichnisse. Ich habe angenommen, das Verzeichnis, das Sie entfernen möchten, istC:\Share\

Die Batch-Datei sollte ungefähr so ​​aussehen:

del /s /f /q c:\share\*.*
for /f %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

del /s /f /q durchsucht den Verzeichnisbaum rekursiv und löscht alle Dateien (auch schreibgeschützte Dateien), ohne zur Bestätigung aufzufordern.

Die zweite Zeile durchläuft alle Unterverzeichnisse (die jetzt leer sein sollten) und entfernt sie.

Dies sollte die einfachste Möglichkeit sein, den gesamten Ordner zu löschen und neu zu erstellen.

Windos
quelle
Wenn ich hier eine kleine Korrektur "für / f %% f" -> "für / f% f" mache, dann funktioniert es einwandfrei :) Vielen Dank.
Michael K
6
delist nicht nötig. rd/s/qlöscht sowohl Dateien als auch Unterordner.
Grawity
1
@grawity das delist hauptsächlich für alle dateien im root ordner da, könnte aber den rekursionsschalter entfernen.
Windos
5
@MichaelK, %% f wird in Stapeldateien verwendet,% f, wenn es sich um einen einzelnen Befehl direkt in der Befehlszeile handelt.
Windos
1
Wenn einer der Unterverzeichnisnamen Leerzeichen enthält, können Sie "delims =" hinzufügen, um sie korrekt zu verarbeiten (für / f "delims =" %% f in ...): Siehe stackoverflow.com/q/5553040/64918
goldPseudo
27
rmdir /s/q C:\Share

Sie erhalten einen "Syntaxfehler", weil rmdirnur vollständige Namen akzeptiert werden, keine Platzhalter. (In cmd.exewird die Platzhaltererweiterung den einzelnen Programmen überlassen, nicht allen.)

Wenn Sie viele Verzeichnisse haben, die mit beginnen Share..., verwenden Sie eine forSchleife.

for /d %f in (C:\Share*) do rmdir /s/q "%f"
Grawity
quelle
3
Ich möchte den Freigabeordner nicht löschen.
Michael K
12

Versuchen Sie dies an einer Eingabeaufforderung:

rd /s/q "C:\Share"
Chau Chee Yang
quelle
2
Dies entfernte auch den übergeordneten Ordner, nicht den Inhalt des Ordners.
Teoman Shipahi
2

Wie wäre es mit ?

rmdir /S /Q "target"
mkdir "target

BEARBEITEN: Diese Lösung ist natürlich nur dann anwendbar, wenn Sie eine vorübergehende Abwesenheit eines Ordners tolerieren können.

Vasilly.Prokopyev
quelle
Dies würde den ursprünglichen Ordner löschen.
Michael K
@MichaelK Meine Aufgabe war in der Lage, eine vorübergehende Abwesenheit von Ordnern zu tolerieren, daher habe ich diese Lösung gewählt. Ich dachte, dass es einfacher und lesbarer ist als for /fin ähnlichen Fällen.
Ich
2
for /f "delims=" %%f in ('dir /ad /b c:\share\') do rd /s /q c:\share\%%f

Dies funktioniert nicht, wenn die Unterverzeichnisse andere Verzeichnisse enthalten, die Leerzeichen enthalten.

Damit dies funktioniert, musste ich die letzte Zeichenfolge wie folgt zitieren

für / f "delims =" %% f in ('dir / ad / bc: \ share \') mache rd / s / q "c: \ share \ %% f"

Anscheinend bewirkt dies, dass der Befehl an der angegebenen Zeichenfolge und nicht nur an der Zeichenfolge selbst arbeitet.

Jim JR Harris
quelle
0

Ich würde dies in dem Ordner versuchen, in dem alle Unterordner gelöscht werden sollen, aber der Stammordner (und die Dateien im Stammordner) bleiben unverändert: für / D% v in (*) do rd / s / q% v

for / D vergleicht Verzeichnisse und rd / s / q löscht jeweils ein Verzeichnis

Otto Hänninen
quelle
0

einfach:

rmdir / s / q "Pfad"

mkdir "Pfad"

eli
quelle
1
Dies ist ein Duplikat dieser Antwort .
Ich sage Reinstate Monica