Wie kann man leere Unterverzeichnise per Batch löschen?
Hallo,
Ich suche nach einem Batch-Befehl, mit dem ich alle leeren Unterverzeichnisse (und auch deren Unterverzeichnisse) eines bestimmten Verzeichnisses löschen kann. Ich hoffe das ihr mir damit weiterhelfen könnt,
Freundliche Grüße, Dominik
2 Antworten
Das ist ein bisschen umständlich und Du solltest Dir die Hilfen zu den jeweiligen Befehlen sehr gut durchlesen, da Du Dir hiermit bei unqualifiziertem Gebrauch/Veränderungen u.U. auch Ordner mit Inhalt löschen kannst!
@echo off
setlocal enabledelayedexpansion
REM KEINE Wildcards in den Parameter-Angaben !!!
for %%P in (%*) do (
pushd "%%~fP"
echo.
echo Bereinige "%%~fP" ...
echo.
for /R %%V in (*) do (
echo.
echo Überprüfe "%%~fV" auf Inhalte ...
echo.
set /a counter=0
for /f "usebackq delims=" %%D (`dir /a/b/-p "%%~fV"`) do (
set /a counter+=1
)
if !counter! equ 0 (
call :queryDel "%%~fV"
) else (
echo !counter! Objekte gefunden.
)
)
popd
)
echo.
echo Fertig.
echo.
goto :eof
:queryDelgoto :eof
echo Der Ordner "%~f1" scheint leer zu sein.
choice /N /M "Wollen Sie diesen Ordner jetzt löschen [J/N]? "
if errorlevel 1 exit /b 1
if errorlevel 0 rd "%~f1"
Ich habe dieses Skript NICHT GETESTET, da ich gerade unter Linux arbeite. Aber es sollte auch das tun, was es soll. Falls sich dennoch ein Fehler eingeschleust haben sollte, dann sag kurz Bescheid, damit ich das nochmal debuggen kann.
Wie auch immer, Du benutzt dieses Skript auf eigenes Risiko. Beim automatischen Löschen ist IMMER Vorsicht angeraten. Du solltest zur Sicherheit einige PAUSE-Befehle einfügen und die erste Zeile auf "@echo on" setzen, damit Du den Ablauf verfolgen kannst und zur Not abbrechen kannst (CTRL+C).
Ansonsten: viel Spaß!
Hallo DominikPrinz,
zu 1.:Wenn Du dieses Skript von der Befehlszeile aus aufrufst, gibst Du einfach alle betreffenden Ordner als Parameter an. Dies werden dann nacheinander abgearbeitet und in allen Unterordnern werden leere Ordner gelöscht. Aber wie ich im REM bemerkt habe, darfst Du als Parameter keine Wildcards verwenden ("*", "?"). Ich hoffe, Du weisst, dass Du IMMER auf korrekte Formatierung der Pfadangaben achten musst (Anführungszeichen). Z.B.:
C:\>DelEmptyFolders.cmd "C:\Users\Dominik\AppData\Roaming\Microsoft\Windows\Start Menu" "%TEMP%"
Hier ("C:\>" ist die Eingabeaufforderung) werden alle leeren Unterordner in Deinem Startmenü und im Windows-Temp-Ordner gelöscht. Du siehst, das Du hier zum Beispiel auch einfach System-Umgebungsvariablen setzen kannst.
Aber Du solltest besser immer auch die Pfade in Anführungszeichen setzen, da sonst u.U. ein ganz anderer Pfad verarbeitet wird oder das Skript einfach abbricht.
Beim Punkt "Fehler-Abbruch" empfehle ich immer, dass man Skripte manuell in der Konsole ausführen lassen sollte, damit man eventuelle Fehler-Meldungen überhaupt mit bekommt.
Es geht aber auch – wenn das Skript sicher und sauber läuft – per Windows Explorer. Dazu erstellt man sich einfach irgendwo einen Link von dem Skript und zieht dann einfach die entsprechenden Ordner auf dieses Icon.
Das ist dann sehr viel bequemer, als immer wieder den ganzen Text eingeben zu müssen. Allerdings gehen dann aber Fehler-Meldungen u.U. verloren, da sich das Fenster schneller schließt, als man die letzte Meldung lesen kann.
Ich behelfe mir dann immer dadurch, indem ich einen der folgenden Befehle als Letzten einfüge:
pause
sleep 10
timeout /t 10
choice /c:123 /t:10 /M "Das Fenster schließt in 10 Sekunden ..."
ping -n 10 127.0.0.1 > NUL
In diesem Fall sollte dieser Befehl vor dem ersten "goto :eof" stehen, da das Skript hier endet.
Diese Befehle funktionieren alle, manche aber nur unter bestimmten Windows-Versionen. Der Erste und der Letzte funktionieren aber überall.
Wenn Du dies in ein Backup-Skript einbauen willst, dann gibst Du einfach den Befehl, wie ich ihn oben für die Eingabeaufforderung gezeigt habe, in Dein Backup-Skript ein.
Du solltest dennoch dieses Skript separat speichern und evtl. im Pfad verfügbar machen. Dadurch ist es universell einsetzbar und Du musst nicht auch immer den ganzen Skript-Pfad bei jedem Aufruf eintippen.
Entweder speicherst Du das Skript unter "C:\WINDOWS" oder "C:\WINDOWS\system32" oder Du in einem eigen Ordner (z.B. "C:\MyProjects\Batch") und fügst diesen zur PATH-Variable hinzu:
http://www.computerhope.com/issues/ch000549.htm
Eigentlich sollte der Befehl RMDIR auch nur für leere Verzeichnisse funktionieren, so dass dieses Skript schon eher über-vorsichtig angelegt ist.
Aber eigentlich geht auch immer genau das schief, was eigentlich nicht schief gehen kann ;-)
Wie auch immer. Wenn es doch mal Probleme verursachen sollte, dann hast Du ja bereits vorher alles gesichert.
Oh, noch eine Kleinigkeit:
Ich habe in den Textausgaben Nicht-ASCII-Zeichen. Daher solltest Du dieses Skript besser mit einem Editor speichern, der den OEM-Zeichensatz beherrscht (also NICHT notepad.exe), sonst kommen dort nachher falsche Zeichen raus.
Hallo!
Der Befehl heist "rd" (remove dir), es gibt noch einige Parameter, u.a. um auch Unterverzeichnisse zu löschen, gib da im cmd-Fenster einfach "rd ?" ein.
Gruß
Für "rd" gibt es zwei Parameter, jedoch hilft mir keins von beiden weiter, da ich, wie in der Frage steht, nur die leeren Verzeichnisse und Unterverzeichnisse löschen möchte.
Erstmal danke für deine Mühe, aber
Ich hoffe dass ich mich halbwegs verständlich ausgedrückt habe ^^.