virgil
Goto Top

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:

:: 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 face-smile

Gruß
ViRGiL

Content-Key: 108976

Url: https://administrator.de/contentid/108976

Printed on: April 18, 2024 at 05:04 o'clock

Mitglied: 60730
60730 Feb 13, 2009 at 21:28:47 (UTC)
Goto Top
Servus,

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 - face-wink
Bastla 4 president face-wink
a-d? - ich werd alt und müde *gg*
Member: bastla
bastla Feb 13, 2009, updated at Oct 18, 2012 at 16:37:45 (UTC)
Goto Top
Hallo ViRGiL!

Vielleicht so:
dir D:\Verzeichnis /s /b /a-d>nul 2>nul||echo leer
oder wie hier ...

Grüße
bastla
Member: ViRGiL
ViRGiL Feb 15, 2009 at 13:49:45 (UTC)
Goto Top
Hallo,

so ich wieder!

Ähm, euro vorschläge haben leider nicht funktioniert, d.h.:

1. So wie der Code in meinem ersten Post ist, ist es egal ob sich eine Datei, ein Verzeichnis oder nichts im Ordner befindet es kommt immer 0 raus = immer LEER

Tip von Time Beil:
2. mit "dir >>Verzeichnis<<* /s /ad" kommt immer die gleiche Zahl raus (7) egal welchen Pfad ich wähle (es ist auch egal ob weitere Veerzeichnisse im Ordner sind oder nicht immer 7 = immer Dateien vorhanden

3. mit "dir >>Verzeichnis<<* /ad", gleiche wie bei 2. nur mit der 6 = immer Dateien vorhanden

Tip von bastla

5. der Link, da blick ich gar nicht weiter durch, d. h.ich verstehe zwar was da wie und warum passiert, aber ich kann nicht das nicht in meinen Code umsetzen!

*grübel*

trotzdem schon mal danke für die ersten Tips face-smile

Auf zur Runde 2 :-P *fg*

Gruß
ViRGiL
Member: bastla
bastla Feb 15, 2009 at 15:52:37 (UTC)
Goto Top
Hallo ViRGiL!
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\*.*
oder einfach mit
dir /s /b /a-d D:\Verzeichnis
Grüße
bastla
Member: ViRGiL
ViRGiL Feb 15, 2009 at 18:06:15 (UTC)
Goto Top
Ah...,

jetzt weiss ich woran es lag!

Tja, ich sag mal Anfängerfehler *g*

Ich habe in meinem Script ein Menu eingebaut und in diesem Menü habe ich eine TestSektion eingebaut, d.h. tippe ich auf 5 springt er zum Testbereich, welches sich am Ende befindet. Kurz um die Variablenzuweiseung befindet sich zwischen Menu und Testbereich, dem zur Folge waren die Variablen nicht definiert, weil sie nicht ausgeführ wurden, öhm, stimmt doch oder?

Weil Versteckte-Dateien sind bei mir sichtbar, daher weiss ich definitiv, dass der ein oder andere tatsächlich leer ist!

Denn nun funktioniert es auch, zumindest die Prüfung ob das Verzeichnis leer ist oder nicht, jetzt wollte ich das in eine If-Anweisung packen, also wenn Verzeichnis leer goto :xxx, da wohl die 2 als Errorlevel ausgegeben werden sollte, oder habe ich da was falsch verstanden??

ViRGiL
Member: bastla
bastla Feb 15, 2009 at 18:11:29 (UTC)
Goto Top
Hallo ViRGiL!
wenn Verzeichnis leer goto :xxx
... wäre dann:

Grüße
bastla
Member: ViRGiL
ViRGiL Feb 15, 2009 at 19:48:02 (UTC)
Goto Top
Hallo,

so jetzt aber!

mit
<code type=\"plain\">


klappt es nun wunderbar!! Nach dem ich auch meinen anfänglichen Fehler beseitigt habe face-smile

Also auf zur nächsten Hürde!!

Gruß
ViRGiL

P.S.: Und wieder besten Dank an alle Mitwirkenden, insbesondere bastla!
Member: Andi4hu
Andi4hu May 17, 2013, updated at May 23, 2013 at 15:02:57 (UTC)
Goto Top
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.
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%
		)  
	)
)
Member: bastla
bastla May 17, 2013 updated at 10:41:03 (UTC)
Goto Top
Hallo Andi4hu und willkommen im Forum!
:: The editor of this site interferes shamelessly - really bad
If the editor had been used properly the line would read
dir /B /A:D %%i >nul 2>&1 || (
- and, BTW,
dir /B /AD %%i >nul 2>&1 || (
would work too (in both versions of course only when there are no blanks in the name/path of the directory face-wink - so better use
dir /B /AD "%%i" >nul 2>&1 || (
) ...

Grüße
bastla
Member: Biber
Biber May 17, 2013 updated at 11:28:07 (UTC)
Goto Top
... 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
Member: Frank
Frank May 23, 2013 at 15:11:43 (UTC)
Goto Top
Hi

@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 face-wink

@Andi4hu

use Tags for Sourcecode!

Best Regards
Frank
Webmaster
Member: bastla
bastla May 23, 2013 at 16:18:08 (UTC)
Goto Top
@ Frank

Schön wäre es in (den vielen) derartigen Fällen, wenn es möglich wäre, direkt auf
Formatting instructions in the posts
zu verlinken ...

Grüße
bastla
Member: Frank
Frank May 23, 2013 at 16:22:38 (UTC)
Goto Top
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
Member: Biber
Biber May 23, 2013 updated at 16:29:54 (UTC)
Goto Top
@ bastla
Oder alternativ zu verlinken auf

Kann deinen Vorschlag nur unterstützen - dieser Link (der Hinweis auf Codeformatierung) wird so oft benötigt,
dass er eigentlich mit in (d)eine Standard-Signatur gehören würde.

Grüße
Biber
Member: Andi4hu
Andi4hu May 28, 2013 at 07:06:45 (UTC)
Goto Top
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.

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
Member: Andi4hu
Andi4hu May 28, 2013 at 07:11:57 (UTC)
Goto Top
Hi,
also für die Anzeige ist das mit den Code-tags ja ganz schön, aber wenn das einer rauskopiert hat er zum einen keine Zeilenschaltungen mehr drin und zum anderen die Zeilennummern mit Punkt und Leerzeichen rein gepfropft bekommen.
Auch nicht so das Gelbe vom Ei.

Viele Grüsse
Andi
Member: Frank
Frank May 28, 2013 updated at 07:17:46 (UTC)
Goto Top
Hi Andi,

dafür gibt es oben rechts am Codeblock den Button/Link Quelltext
Alternativ gibt es die Angabe: typ=plain im Code-Tag. Dann sind die Zeilennummern nicht mit dabei.
Schau einfach mal in die Formatierungsmöglichkeiten rein.

Gruß
Frank
Member: Andi4hu
Andi4hu May 28, 2013 at 07:19:58 (UTC)
Goto Top
Hi,
ja, hatte ich gerade und wollte meinen Kommentar löschen. ging aber nicht, weil du so schnell warst.

Die Quelltext-Schaltfläche bei Code-Beispielen ist wirklich hilfreich.

Viele Grüße
Hotly discussed
AlexWishaHow to set up and configure a Linux GRE tunnelAlexWisha - 3 CommentsDaniEnd of Support dates for Office 2016, 2019 Apps und Productivity ServersDani - 1 Comment