Prüfen ob Verzeichnis inkl. Unterverzeichnisse leer ist
Hallo,
ich stecke gerade bei dem Versuch fest, einen Code zu schreiben, welcher bestimmte Verzeichnisse auf Leere prüfen soll, also inkl. Unterverzeichnisse. D.h. folgenden Code habe ich bereits gefunden aber der will nicht so recht funktionieren:
Wie gesagt dieser funktioniert nicht wirklich, weil dieser nicht die Unterverzeichnisse durchsucht, d.h. wenn Unterverzeichnisse vorhanden sind gibt dieser mir immer ein Leer (0 Dateien) aus, was ja nur bedingt richtig ist. da eben dann in den Unterverzeichnissen Dateien vorhanden sind! Vielleicht hat einer einen Tip!
Ich bin auch für andere Ideen offen
Gruß
ViRGiL
ich stecke gerade bei dem Versuch fest, einen Code zu schreiben, welcher bestimmte Verzeichnisse auf Leere prüfen soll, also inkl. Unterverzeichnisse. D.h. folgenden Code habe ich bereits gefunden aber der will nicht so recht funktionieren:
:: Prüfen ob Daten vorhanden sind (ob Verzeichnis leer ist)
set count=0
for %%i in ('%LWC%*') do set /a count+=1
if "%count%"=="0" goto :next2
...
:: Prüfung Ende
Wie gesagt dieser funktioniert nicht wirklich, weil dieser nicht die Unterverzeichnisse durchsucht, d.h. wenn Unterverzeichnisse vorhanden sind gibt dieser mir immer ein Leer (0 Dateien) aus, was ja nur bedingt richtig ist. da eben dann in den Unterverzeichnissen Dateien vorhanden sind! Vielleicht hat einer einen Tip!
Ich bin auch für andere Ideen offen
Gruß
ViRGiL
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 108976
Url: https://administrator.de/forum/pruefen-ob-verzeichnis-inkl-unterverzeichnisse-leer-ist-108976.html
Ausgedruckt am: 23.07.2025 um 12:07 Uhr
18 Kommentare
Neuester Kommentar

Servus,
ein
oder haltungetestet und deinem Ansatz folgend:
gruß
Edit -
Bastla 4 president
a-d? - ich werd alt und müde *gg*
ein
rd verzeichnis
funktioniert "so" auch nur, wenn weder Ordner oder Dateien darin sind.oder haltungetestet und deinem Ansatz folgend:
:: Prüfen ob Dateien vorhanden sind
set count=0
for %%i in ('%LWC%*') do set /a count+=1
if "%count%"=="0" goto :next2
:Ordner finden...
for %%i in ('dir , /AD') do set /a count+=1
if "%count%"=="0" goto :next2
:: Prüfung Ende
gruß
Edit -
Bastla 4 president
a-d? - ich werd alt und müde *gg*
Hallo ViRGiL!
Vielleicht so:
oder wie hier ...
Grüße
bastla
Vielleicht so:
dir D:\Verzeichnis /s /b /a-d>nul 2>nul||echo leer
Grüße
bastla
Hallo ViRGiL!
Überprüfen lässt sich das mit
oder einfach mit
Grüße
bastla
mit "dir D:\Verzeichnis /s /b /a-d>nul 2>nul||echo leer" passiert nichts = also ob die Zeile überflüssig wäre
Es sollte doch nur etwas passieren, wenn das Verzeichnis (inkl Unterverzeichnisse) keine Dateien enthält - demnach gibt es vermutlich mindestens eine (versteckte, Systemdatei?) Datei ...Überprüfen lässt sich das mit
attrib /s D:\Verzeichnis\*.*
dir /s /b /a-d D:\Verzeichnis
bastla
Hi,
in der Kürze liegt die Würde - immer noch.
Keine errorlevels, keine Gotos, einfach eine kleine, feine Kommandofolge.
Achtung, das Editorprogramm dieser Website mischt sich schamlos ein und verzerrt den Code mit einem smiley
Und das mitten im Code. Lest also die Zeilen nach den :: im Code.
Sonst funktioniert es nicht.
Und die Syntaxdarstellung mit den Einrückungen ist auch hin, aber das macht ihr schon...
Check this out. To me it's more elegant because it does not contain quite so complicated commands. It took me a while to come up with that.
in der Kürze liegt die Würde - immer noch.
Keine errorlevels, keine Gotos, einfach eine kleine, feine Kommandofolge.
Achtung, das Editorprogramm dieser Website mischt sich schamlos ein und verzerrt den Code mit einem smiley
Und das mitten im Code. Lest also die Zeilen nach den :: im Code.
Sonst funktioniert es nicht.
Und die Syntaxdarstellung mit den Einrückungen ist auch hin, aber das macht ihr schon...
Check this out. To me it's more elegant because it does not contain quite so complicated commands. It took me a while to come up with that.
REM Erläuterungen
REM Befehl hinter doppelten Ampersands wird nur ausgeführt, wenn der Befehl vor den Ampersands erfolgreich war
REM Befehl hinter doppelten Pipes wird nur ausgeführt, wenn der Befehl vor den Pipes fehl schlug
REM Im folgenden wird die gesamte Unterverzeichnisstruktur durchlaufen
REM Das erste dir testet auf Dateien im Verzeichnis, gibt es keine, so
REM testet das zweite dir auf UnterVerzeichnisse im untersuchten Verzeichnis
Rem Dieser Test muss sein, weil im obersten Verzeichnis einer DB nur Unterverzeichnisse
rem mit Datums-Verzeichnissen, aber keine Dateien liegen
REM Genaugenommen ist das eine Schönheitsoperation, weil er die mit rd so einfach ohnehin
REM nicht löschen würde.
REM Jedenfalls soll auch dieses Oberverzeichnis von Haus aus übersprungen werden.
REM Der Befehl nach einem doppeltem Pipe wird nur ausgeführt,
REM wenn der Befehl davor fehl schlug. Das geht nach dem Motto^:
REM keine Dateien gefunden, dann mach weiter,
REM keine Unterverzeichnisse gefunden, dann lösch
REM s b ad zeigt nur ein gefundenes Unterverzeichnis an.
REM Das Geniale hier ist, dass der Punkt für das aktuelle Verzeichnis ausgespart wird und der
REM doppelte Punkt fürs übergeordnete Verzeichnis auch.
REM Find wird angewiesen, alles zu suchen, das nicht die leere Zeichenkette ist
REM Mit anderen Worten, wenn ein Unterverzeichnis enthalten ist - dass keine Dateien drin liegen
REM hatte ich ja schon verifiziert.
REM Um es kurz zu halten, wird nur die 1 bzw. die Anzahl der gefundenen Unterverzeichnisse von find ausgegeben,
REM die ich dann noch in nul versenke, weil ich keine Ausgabe benötige.
REM Wenn nichts gefunden wird, dann gilt der Befehl als nicht erfolgreich ausgeführt.
REM Jetzt bediene ich mich des doppelten Pipes wonach genau dann Befehle ausgeführt werden, wenn der vorherige fehl schlug.
REM Der Witz hier ist, dass ich nach dem doppelten Pipe eine runde Klammer öffne und damit einen ganzen Satz von
REM verschachtelten Befehlen ausführen kann - genau was ich brauche.
REM Ja und da ich weiß, dass Prozent-i ein Verzeichnis ist, das komplett leer ist und dann lösche ich es
REM Ta ta ^.^.^.
REM ///////////////////////////////////////////////////////////////////////////////
REM ////////////// ITERATE DIRECTORY FOR ///////////////////////////////////
REM ////////////// EMPTY SUBDIRECTORIES /////////////////////////////////
REM ////////////// AND DELETE THEM /////////////////////////////////////
REM ///////////////////////////////////////////////////////////////////////////////
REM This is a small batch procedure that checks a directory structure for empty folders ^(no files, no subdirs^)
REM And then works on the empty folders, in this case deletes them
REM Working on the empty folders proved to be more difficult than working on the ones with data.
REM
REM Explanations
REM am_DirectoryWhereToDeleteEmptyDirs will be iterated including all its Subdirectories
REM The first dir command within the for checks whether ^%^%i contains files
REM If it doesn't then the second dir command checks whether ^%^%i contains subfolders.
REM Even though a simple rd command would not delete a directory with subfolders,
REM So this really is a matter of elegance.
REM A command after a double pipe will only be executed if the preceding command is considered to have failed.
REM The parameters ^/s ^/b ^/ad only show directories that have been found, then they are depicted by their full name only.
REM The good news here is that the dot and double dot for current and parent directory will be skipped.
REM Find is now told to search for anything it is being passed, but an empty string.
REM Since I don't need any output I first limit it to a numeral and then I dump it into nirvana.
REM The good thing is if nothing has been found then the command is regarded as having failed.
REM So now I know if it has failed the directory currently being worked on is empty.
REM And by using the double pipe - previous command failed - I then happily delete it.
REM The trick also is that by opening a round bracket after the double pipe I can
REM run a whole stack of commands.
REM TEEME and Log are special Variables for logging. You don't have to use them.
REM
REM I have looked around and all I googled was unsatisfactory.
REM Either too complicated or too much programming or what have you.
REM Other advantages of this solution are that it spares you of catching errorlevels and of setting gotos.
REM It is rather simple, and that exactly is what I like, very pleasant for an admin.
REM So I share this with the www community.
REM Cheers, Andi.
REM Watch out. the editor of this website interfered, make sure you read the
REM lines in the code after the double colons first
REM The first line is a command. By setting echo instead of :: it would flow into the logfile.
for /f "delims=" %%i in ('dir %am_DirectoryWhereToDeleteEmptyDirs% /s/b/ad ^| sort /r') do (
:: Testing whether %%i is empty and can be deleted %TEEME%
:: The editor of this site interferes shamelessly - really bad
:: Instead of the smiley it should read
:: Slash A colon dash D
:: The dash reverses the effect, so now only files are found but no directories
dir /B /A:-D %%i >nul 2>&1 || (
echo %%i contains no files %TEEME%
dir %%i /s /b /ad |find /v "" /C >nul 2>&1|| (
echo Folder %%i contains no Subfolders either and will be deleted now ^.^.^. %TEEME%
rd "%%i" >>%LOG% 2>>&1
if {%TRACE%}=={echo} echo. %TEEME%
)
)
)
Hallo Andi4hu und willkommen im Forum!
- and, BTW,
would work too (in both versions of course only when there are no blanks in the name/path of the directory
- so better use
) ...
Grüße
bastla
:: The editor of this site interferes shamelessly - really bad
If the editor had been used properly the line would readdir /B /A:D %%i >nul 2>&1 || (
dir /B /AD %%i >nul 2>&1 || (
dir /B /AD "%%i" >nul 2>&1 || (
Grüße
bastla
... alternativ liesse sich auch
dir /b /a:d "%%i" ....
..schreiben, da wird kein Smiley hineininterpretiert.
Aber noch ist, wie ich vorhin gelernt habe, die Verwendung unserer Code-Formatierung dank grosszügiger Werbefinanzierung durch Meica-Würstchen, den neuen Twingo und diverse Baggerchats vollkommen kostenlos für registrierte Mitglieder.
Grüße
Biber
dir /b /a:d "%%i" ....
..schreiben, da wird kein Smiley hineininterpretiert.
Aber noch ist, wie ich vorhin gelernt habe, die Verwendung unserer Code-Formatierung dank grosszügiger Werbefinanzierung durch Meica-Würstchen, den neuen Twingo und diverse Baggerchats vollkommen kostenlos für registrierte Mitglieder.
Grüße
Biber
Hi
@Biber,
.. und wird es auch immer bleiben
@Andi4hu
use Tags for Sourcecode!
Best Regards
Frank
Webmaster
@Biber,
Aber noch ist, wie ich vorhin gelernt habe, die Verwendung unserer Code-Formatierung dank grosszügiger Werbefinanzierung durch Meica-Würstchen, den neuen Twingo und diverse Baggerchats vollkommen kostenlos für registrierte Mitglieder.
.. und wird es auch immer bleiben
@Andi4hu
use Tags for Sourcecode!
Best Regards
Frank
Webmaster
@ Frank
Schön wäre es in (den vielen) derartigen Fällen, wenn es möglich wäre, direkt auf
Formatierungen in den Beiträgen
zu verlinken ...
Grüße
bastla
Schön wäre es in (den vielen) derartigen Fällen, wenn es möglich wäre, direkt auf
Formatierungen in den Beiträgen
zu verlinken ...
Grüße
bastla
Hallo @bastla,
in der Tat, ich habe da aber noch einen Fehler drin. Die #toc-id wird aktuell dynamisch erzeugt. Das ist mittlerweile nicht mehr sinnig. Ich schreibe es auf meine ToDo Liste.
Gruß
Frank
in der Tat, ich habe da aber noch einen Fehler drin. Die #toc-id wird aktuell dynamisch erzeugt. Das ist mittlerweile nicht mehr sinnig. Ich schreibe es auf meine ToDo Liste.
Gruß
Frank
Hi,
ja, das mit den Anführungszeichen ist mir inzwischen aufgefallen, da ich für Testzwecke mit "New Folder" experimentiert hatte und es nicht ging.
Ich hatte es für Datenbanksicherungen eingesetzt und dort verwende ich als vorsichtiger Admin keine Leerzeichen in Pfaden. Immer noch nicht, weshalb es mir erst entging.
Einfach alle Vorkommnisse von %%i in Anführungszeichen einschließen --> "%%i" und alles ist gut.
Dein Korrekturvorschlag ist allerdings falsch, da du den Bindestrich nicht mit drin hast.
Also hier noch mal verbesserter Code, ohne die Kommentare und dieses mal als Code
Der hat jetzt noch einen Zähler drin, der hinterher ausgibt, wieviele Verzeichnisse denn tatsächlich gelöscht wurden.
Wie gesagt, %TEEME% ist eine Variable, die in eine Logdatei umlenkt, das müsste jemand, der den Code verwenden will, halt ändern.
Cheers,
Andi
ja, das mit den Anführungszeichen ist mir inzwischen aufgefallen, da ich für Testzwecke mit "New Folder" experimentiert hatte und es nicht ging.
Ich hatte es für Datenbanksicherungen eingesetzt und dort verwende ich als vorsichtiger Admin keine Leerzeichen in Pfaden. Immer noch nicht, weshalb es mir erst entging.
Einfach alle Vorkommnisse von %%i in Anführungszeichen einschließen --> "%%i" und alles ist gut.
Dein Korrekturvorschlag ist allerdings falsch, da du den Bindestrich nicht mit drin hast.
Also hier noch mal verbesserter Code, ohne die Kommentare und dieses mal als Code
Der hat jetzt noch einen Zähler drin, der hinterher ausgibt, wieviele Verzeichnisse denn tatsächlich gelöscht wurden.
Wie gesagt, %TEEME% ist eine Variable, die in eine Logdatei umlenkt, das müsste jemand, der den Code verwenden will, halt ändern.
Goto :EOF
REM //////////////////////////////////////////////////////////////////////////
REM /////// DeleteEmptyDirectories ///////////////////
:DeleteEmptyDirectories
REM Verzeichnisparameter wurde in aufrufender Routine gesetzt.
%TRACE% Jetzt in DeleteEmptyDirectories in _amProcLib %0 %TEEME%
%TRACE% Leere Unterverzeichnisse in %am_DirectoryWhereToDeleteEmptyDirs% werden nun gelöscht^.^.^. %TEEME%
if {%TRACE%}=={echo} echo. %TEEME%
REM ///////////////////////////////////////////////////////////////////////////////
REM ////////////// ITERATE DIRECTORY FOR ///////////////////////////////////
REM ////////////// EMPTY SUBDIRECTORIES /////////////////////////////////
REM ////////////// AND DELETE THEM /////////////////////////////////////
REM ///////////////////////////////////////////////////////////////////////////////
set am_CounterDeletedFolders=0
for /f "delims=" %%i in ('dir %am_DirectoryWhereToDeleteEmptyDirs% /s/b/ad ^| sort /r') do (
::echo Testing whether %%i is empty and can be deleted %TEEME%
REM Achtung - Prozentii muss immer in Anführungszeichen gehalten werden, wegen etwaiger Leerzeichen im Pfad.
dir /B /A:-D "%%i" 2>&1 || (
echo "%%i" contains no files %TEEME%
dir "%%i" /s /b /ad |find /v "" /C >nul 2>&1|| (
echo Folder "%%i" contains neither Files nor Subfolders and will be deleted now ^.^.^. %TEEME%
set /A am_CounterDeletedFolders +=1
rd "%%i" >>%LOG% 2>>&1
if {%TRACE%}=={echo} echo. %TEEME%
)
)
)
REM Hinter die rd-Zeile noch den Errorlevel einzufangen geht nicht, da EnableDelayedExpansion nicht benutzt wird.
:: set amErrorlevelDelDir=%errorlevel%
:: echo amErrorlevelDelDir=%amErrorlevelDelDir% %TEEME%
if {%TRACE%}=={echo} echo. %TEEME%
echo /////////////////////////////////////////////////////////////////////////////////// %TEEME%
echo /////// Zusammenfassung von DeleteEmptyDirectories in _amProcLib ////////////// %TEEME%
echo /////// Es wurden insgesamt %am_CounterDeletedFolders% leere Ordner entfernt. ////////////// %TEEME%
echo /////////////////////////////////////////////////////////////////////////////////// %TEEME%
if {%TRACE%}=={echo} echo. %TEEME%
%TRACE% Wir verlassen nun die Sub-Routine DeleteEmptyDirectories ^(remove directory^) %TEEME%
GoTo :EOF
Cheers,
Andi