Batch Script zum Löschen leerer Ordner

sp33d

Commander
Registriert
Sep. 2008
Beiträge
2.558
servus,
hab heute ne ganze weile an nem script geschrieben, das mir alle leeren ordner unterhalb eines angegebenen verzeichnisses löscht.
hintergrund war, dass in meinem musikordner viele unterordner mit covern und unnützem zeug waren.
diese für mich unnötigen dateien habe ich einfach mit der windowssuche (*.jpg etc.) gelöscht.
leider blieben aber nun hunderte von leeren ordnern übrig.
alle einzeln zu löschen hätte ewigkeiten gedauert. also ein script geschrieben:

@echo off


rem ### Pfad, unter dem alle leeren Ordner gloescht werden sollen wird gesetzt ###

set /p pfad=Bitte den gewuenschten Pfad angeben:

echo Es wurde %pfad% als Pfad angegeben.

echo Starte Loeschvorgang von leeren Ordnern in %pfad%.


rem ### Temporaeres Verzeichnis c:\temp\ wird erstellt, falls es nicht schon existiert. ###

if not exist c:\temp\ md c:\temp\


rem ### Falls noch die Datei c:\temp\tmp.txt existiert, so wird sie geloescht. ###

if exist c:\temp\tmp.txt del /F /Q c:\temp\tmp.txt


rem ### Schreibe alle Ordnerpfade in c:\temp\tmp.txt. ###

dir /AD /b /s %pfad% >> c:\temp\tmp.txt


rem ### Loesche alle leeren Ordner. ###

FOR /F "delims=" %%i IN (c:\temp\tmp.txt) DO rd "%%i"

echo Es wurde alle leeren Ordner geloescht!


rem ### Loesche die temporaere Datei c:\temp\tmp.txt und ggf. den leeren Ordner c:\temp\ ###

if exist c:\temp\tmp.txt del /F /Q c:\temp\tmp.txt

if exist c:\temp\ rd c:\temp\


pause


da ich alles kommentiert habe sollte der code selbsterklärend sein. ;)

das ganze einfach in ne neue textdatei kopieren und als blablabla.cmd abspeichern.

vielleicht kann ja jemand was damit anfangen, der ein ähnliches problem hat! ^^

viel spaß damit!
 
oh, mist...
zu deiner zeile: das funktioniert so aber nur, wenn man es in der console eingibt, nicht, wenn man es als batch-datei verwendet.
zudem darf bei "deiner" zeile kein leerzeichen im dateinamen vorkommen. ;)
aaber im prinzip hast du recht. macht "fast" das gleiche... aber eben nur fast! ^^
 
In der Batch wird %I anders interpretiert. Beim Einsatz in einer Batch daher einfach %%I verwenden. Dann gehts wieder.

Aber wer verwendet schon Batch? Jedes mal neu tippen heisst die Devise. Das übt ja auch ;-)
 
ja, richtig. in der console ist %i das selbe wie %%i in einer batchdatei.
und genau damit ich es NICHT jedes mal neu tippen muss hab ich mir n script geschrieben. ^^
aber da hat wohl jeder seine eigenen präferenzen. ;)
nur für mich hätte ich ja auch nicht den kram mit den if-abfragen und der variable gemacht usw.
aber ich dachte, vielleicht kann das ja mal noch jemand gebrauchen.
und dann ist das wesentlich komfortabler, wenn man einfach den pfad angeben kann.
 
Guten Tag und allen ein gutes neues Jahr 2016.

Ich stiess auf dieses Skript über Google und könnte es gut gebrauchen.
Es funktioniert auch einwandfrei - ausgenommen allerdings, dass die leeren Ordner
nicht wirklich gelöscht werden.

Fehlermeldung (wie ich mit einigen eingefügten ECHOs und PAUSEn herausfand)
"Das Verzeichnis ist nicht leer".
Ist es in vielen Fällen aber doch!

Wo kann der Fehler liegen?
(BS ist Win 7 Pro auf dem letzten Stand. Es handelt sich um eine externe NTFS-Platte mit 2 TB)
 
Hallo Skeptiker.
Sind in den betroffenen Verzeichnissen evtl. versteckte Dateien oder Systemdateien vorhanden? Einfach im Explorer einblenden und nachschauen oder mit "dir /A:H" bzw. "dir /A:S" in cmd anzeigen lassen.
 
DANKE! Zu blöd - da hätte ich auch selber drauf kommen können: Die thumbs.db war überall drin. Jetzt hab ich vor das eigentliche Skript ein "del thumbs.db /s" über die ganze Platte gesetzt, und jetzt läuft es korrekt.
Für die Zukunft hänge ich das gleich hinter den Sicherungs-Kopierlauf. ("exclude" hab' ich auch mal hinbekommen - fand es aber umständlich und hab' schon wieder vergessen, wie es funktioniert. So einfach, wie es nach der Hilfe (/?) aussieht, jedenfalls nicht.
 
Hallo Leute,

ich hoffe ihr könnt mir helfen. Wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr. Ich möchte die Zeile in eine Batch-Datei einbauen. Ich ziehe mir vorher per Robocopy nur bestimmte Dateitypen aus einem Ordner mit vielen verschachtelten Unterordnern. Das Problem ist, dass diese auch Leerzeichen enthalten. Ich vermute, dass deswegen das Batch nicht läuft. Meine Zeile sieht folgendermaßen aus:

for /f %%i in ('dir /AD /b /s "d:\Eigene Dateien\ordner 1\unterordner"') do rd %%i

Die Ausgabe ist:

Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
Das System kann die angegebene Datei nicht finden.
usw.

Ich hoffe ihr habt eine Idee...
 
Meine Idee wäre, das %%i am Ende der Zeile in Hochkommata zu setzen. Also:

... do rd "%%i"
 
Ich hatte das gepostet ohne das auszuprobieren. Das Problem ist, dass in der FOR-Schleife standardmäßig ein Leerzeichen als Tokentrenner interpretiert wird. Um der FOR-Schleife zu sagen, sie soll ein anderes Zeichen benutzen, verwendet man den Parameter "delims". Geschickterweise setzt man dort ein Zeichen ein, das in einem Datei- bzw. Ordnernamen nicht vorkommen darf, z.B.: ein Fragezeichen. Somit lautet der vollständige Befehl dann:

for /f "delims=?" %%i in ('dir /AD /b /s "d:\Eigene Dateien\ordner 1\unterordner"') do rd "%%i"
 
Klasse, r0b0t.

Vielen Dank. Das funktioniert super. Da wäre ich nie drauf gekommen. :)
 
Hallo
Erst mal danke für das Skript, auch nach 9 Jahren funktioniert es noch einwandfrei.
Ich habe nur ein kleines Problem und zwar wird die Eingabe der Entertaste benötigt um das Skript zu starten. Jedoch sol dieses bei mir Komplet im Hintergrund funktionieren ohne das jemand etwas davon bemerkt.

Was ich versucht habe ist beim setzen des Pfades das /p zu /a tauschen, jedoch funktioniert dann das setzen des Pfades nicht mehr.

Danke im voraus für eure hilfe.

Lg Hutch79

Edit: Das ganze hat sich soeben erledigt. mit /a anstelle von /p funktioniert alles. So wies aussieht hab ich noch irgendetwas anderes gewechselt.

Lg Hutch79
 
Zuletzt bearbeitet:
r0b0t schrieb:
for /f "delims=?" %%i in ('dir /AD /b /s "d:\Eigene Dateien\ordner 1\unterordner"') do rd "%%i"

Funktioniert klasse! Würde jetzte gerne mit
FOR /F "delims=?" %I IN ('dir /AD /b /s d:\bla') DO rd "%I" > protokoll.txt 2>&1
die Ausgaben und Fehlermeldungen mitprotokollieren, aber die Umleitung der Ausgabe funktioniert hier mit der Schleife nicht so wie gewohnt.

>> statt > war die Lösung 🥳
 
Zurück
Oben