Wie kann man leere Unterverzeichnise per Batch löschen?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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

:queryDel
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"
goto :eof

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ß!


DominikPrinz 
Beitragsersteller
 23.10.2016, 12:21

Erstmal danke für deine Mühe, aber

  1. Wo gebe ich den Pfad zum Ordner an, dessen leere Unterverordner ich löschen möchte?
  2. Ich möchte das ganze in ein Backup-Skript einbauen, es sollen die leeren Unterordner eines bereits gesichteren Ordners gelöscht werden, somit wäre es nicht allzu schlimm wenn einige Ordner mit Inhalt gelöscht werden.

Ich hoffe dass ich mich halbwegs verständlich ausgedrückt habe ^^.

0
MarkusGenervt  23.10.2016, 18:25
@DominikPrinz

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.

zu 2.:

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.

0

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ß


DominikPrinz 
Beitragsersteller
 13.10.2016, 19:30

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.

0