Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Prüfen ob Verzeichnis inkl. Unterverzeichnisse leer ist

Frage Entwicklung Batch & Shell

Mitglied: ViRGiL

ViRGiL (Level 1) - Jetzt verbinden

13.02.2009, aktualisiert 18.10.2012, 10410 Aufrufe, 18 Kommentare, 2 Danke

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:

01.
:: Prüfen ob Daten vorhanden sind (ob Verzeichnis leer ist) 
02.
set count=0 
03.
for %%i in ('%LWC%*') do set /a count+=1 
04.
if "%count%"=="0" goto :next2  
05.
... 
06.
:: 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
Mitglied: 60730
13.02.2009 um 22:28 Uhr
Servus,

ein
rd verzeichnis
funktioniert "so" auch nur, wenn weder Ordner oder Dateien darin sind.

oder haltungetestet und deinem Ansatz folgend:

01.
:: Prüfen ob Dateien vorhanden sind 
02.
set count=0 
03.
for %%i in ('%LWC%*') do set /a count+=1 
04.
if "%count%"=="0" goto :next2  
05.
:Ordner finden... 
06.
for %%i in ('dir , /AD') do set /a count+=1 
07.
if "%count%"=="0" goto :next2  
08.
 
09.
:: Prüfung Ende
gruß

Edit -
Bastla 4 president
a-d? - ich werd alt und müde *gg*
Bitte warten ..
Mitglied: bastla
13.02.2009, aktualisiert 18.10.2012
Hallo ViRGiL!

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

Grüße
bastla
Bitte warten ..
Mitglied: ViRGiL
15.02.2009 um 14:49 Uhr
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
4. mit "dir D:\Verzeichnis /s /b /a-d>nul 2>nul||echo leer" passiert nichts = also ob die Zeile überflüssig wäre

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

Auf zur Runde 2 :-P *fg*

Gruß
ViRGiL
Bitte warten ..
Mitglied: bastla
15.02.2009 um 16:52 Uhr
Hallo ViRGiL!
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\*.*
oder einfach mit
dir /s /b /a-d D:\Verzeichnis
Grüße
bastla
Bitte warten ..
Mitglied: ViRGiL
15.02.2009 um 19:06 Uhr
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
Bitte warten ..
Mitglied: bastla
15.02.2009 um 19:11 Uhr
Hallo ViRGiL!
wenn Verzeichnis leer goto :xxx
... wäre dann:
dir D:\Verzeichnis /s /b /a-d>nul 2>nul||goto :xxx
Die Schreibweise "Befehl1 || Befehl2" bedeutet: "Führe Befehl2 nur aus, wenn Befehl1 einen Errorlevel <> 0 liefert" (Gegenstück ist die Verkettung mit "&&").

Grüße
bastla
Bitte warten ..
Mitglied: ViRGiL
15.02.2009 um 20:48 Uhr
Hallo,

so jetzt aber!

mit
01.
dir D:\\Verzeichnis /s /b /a-d>nul 2>nul||goto :xxx
klappt es nun wunderbar!! Nach dem ich auch meinen anfänglichen Fehler beseitigt habe

Also auf zur nächsten Hürde!!

Gruß
ViRGiL

P.S.: Und wieder besten Dank an alle Mitwirkenden, insbesondere bastla!
Bitte warten ..
Mitglied: Andi4hu
17.05.2013, aktualisiert 23.05.2013
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.
01.
REM Erläuterungen 
02.
REM Befehl hinter doppelten Ampersands wird nur ausgeführt, wenn der Befehl vor den Ampersands erfolgreich war 
03.
REM Befehl hinter doppelten Pipes wird nur ausgeführt, wenn der Befehl vor den Pipes fehl schlug  
04.
REM Im folgenden wird die gesamte Unterverzeichnisstruktur durchlaufen 
05.
REM Das erste dir testet auf Dateien im Verzeichnis, gibt es keine, so 
06.
REM testet das zweite dir auf UnterVerzeichnisse im untersuchten Verzeichnis 
07.
Rem Dieser Test muss sein, weil im obersten Verzeichnis einer DB nur Unterverzeichnisse 
08.
rem mit Datums-Verzeichnissen, aber keine Dateien liegen 
09.
REM Genaugenommen ist das eine Schönheitsoperation, weil er die mit rd so einfach ohnehin  
10.
REM nicht löschen würde. 
11.
REM Jedenfalls soll auch dieses Oberverzeichnis von Haus aus übersprungen werden. 
12.
REM Der Befehl nach einem doppeltem Pipe wird nur ausgeführt,  
13.
REM wenn der Befehl davor fehl schlug. Das geht nach dem Motto^: 
14.
REM keine Dateien gefunden, dann mach weiter, 
15.
REM keine Unterverzeichnisse gefunden, dann lösch 
16.
REM s b ad zeigt nur ein gefundenes Unterverzeichnis an.  
17.
REM Das Geniale hier ist, dass der Punkt für das aktuelle Verzeichnis ausgespart wird und der  
18.
REM doppelte Punkt fürs übergeordnete Verzeichnis auch. 
19.
REM Find wird angewiesen, alles zu suchen, das nicht die leere Zeichenkette ist 
20.
REM Mit anderen Worten, wenn ein Unterverzeichnis enthalten ist - dass keine Dateien drin liegen 
21.
REM hatte ich ja schon verifiziert. 
22.
REM Um es kurz zu halten, wird nur die 1 bzw. die Anzahl der gefundenen Unterverzeichnisse von find ausgegeben, 
23.
REM die ich dann noch in nul versenke, weil ich keine Ausgabe benötige. 
24.
REM Wenn nichts gefunden wird, dann gilt der Befehl als nicht erfolgreich ausgeführt. 
25.
REM Jetzt bediene ich mich des doppelten Pipes wonach genau dann Befehle ausgeführt werden, wenn der vorherige fehl schlug. 
26.
REM Der Witz hier ist, dass ich nach dem doppelten Pipe eine runde Klammer öffne und damit einen ganzen Satz von  
27.
REM verschachtelten Befehlen ausführen kann - genau was ich brauche. 
28.
REM Ja und da ich weiß, dass Prozent-i ein Verzeichnis ist, das  komplett leer ist und dann lösche ich es 
29.
REM Ta ta ^.^.^. 
30.
 
31.
REM /////////////////////////////////////////////////////////////////////////////// 
32.
REM //////////////     ITERATE DIRECTORY FOR    /////////////////////////////////// 
33.
REM //////////////      EMPTY SUBDIRECTORIES      ///////////////////////////////// 
34.
REM //////////////       AND DELETE THEM      ///////////////////////////////////// 
35.
REM /////////////////////////////////////////////////////////////////////////////// 
36.
 
37.
REM This is a small batch procedure that checks a directory structure for empty folders ^(no files, no subdirs^) 
38.
REM And then works on the empty folders, in this case deletes them 
39.
REM Working on the empty folders proved to be more difficult than working on the ones with data. 
40.
REM 
41.
REM Explanations 
42.
REM am_DirectoryWhereToDeleteEmptyDirs will be iterated including all its Subdirectories 
43.
REM The first dir command within the for checks whether ^%^%i contains files 
44.
REM If it doesn't then the second dir command checks whether ^%^%i contains subfolders. 
45.
REM Even though a simple rd command would not delete a directory with subfolders, 
46.
REM So this really is a matter of elegance. 
47.
REM A command after a double pipe will only be executed if the preceding command is considered to have failed. 
48.
REM The parameters ^/s ^/b ^/ad only show directories that have been found, then they are depicted by their full name only. 
49.
REM The good news here is that the dot and double dot for current and parent directory will be skipped. 
50.
REM Find is now told to search for anything it is being passed, but an empty string. 
51.
REM Since I don't need any output I first limit it to a numeral and then I dump it into nirvana. 
52.
REM The good thing is if nothing has been found then the command is regarded as having failed. 
53.
REM So now I know if it has failed the directory currently being worked on is empty.  
54.
REM And by using the double pipe - previous command failed - I then happily delete it. 
55.
REM The trick also is that by opening a round bracket after the double pipe I can 
56.
REM run a whole stack of commands. 
57.
REM TEEME and Log are special Variables for logging. You don't have to use them. 
58.
 
59.
REM  
60.
REM I have looked around and all I googled was unsatisfactory. 
61.
REM Either too complicated or too much programming or what have you. 
62.
REM Other advantages of this solution are that it spares you of catching errorlevels and of setting gotos. 
63.
REM It is rather simple, and that exactly is what I like, very pleasant for an admin. 
64.
REM So I share this with the www community. 
65.
REM Cheers, Andi. 
66.
 
67.
REM Watch out. the editor of this website interfered, make sure you read the  
68.
REM lines in the code after the double colons first 
69.
REM The first line is a command. By setting echo instead of :: it would flow into the logfile. 
70.
 
71.
for /f "delims=" %%i in ('dir %am_DirectoryWhereToDeleteEmptyDirs% /s/b/ad ^| sort /r') do ( 
72.
::  Testing whether %%i is empty and can be deleted %TEEME% 
73.
::  The editor of this site interferes shamelessly - really bad 
74.
::  Instead of the smiley it should read  
75.
::  Slash A colon dash D 
76.
::  The dash reverses the effect, so now only files are found but no directories 
77.
	dir /B /A:-D %%i >nul 2>&1 || ( 
78.
	  echo %%i contains no files %TEEME% 
79.
	  dir %%i /s /b /ad |find /v "" /C >nul 2>&1|| ( 
80.
		 echo Folder %%i contains no Subfolders either and will be deleted now ^.^.^. %TEEME% 
81.
		  rd "%%i" >>%LOG% 2>>&1 
82.
		  if {%TRACE%}=={echo} echo. %TEEME% 
83.
		)   
84.
85.
)
Bitte warten ..
Mitglied: bastla
17.05.2013, aktualisiert um 12:41 Uhr
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 - so better use
dir /B /AD "%%i" >nul 2>&1 || (
) ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
17.05.2013, aktualisiert um 13:28 Uhr
... 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
Bitte warten ..
Mitglied: Frank
23.05.2013 um 17:11 Uhr
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

@Andi4hu

use <code></code> Tags for Sourcecode!

Best Regards
Frank
Webmaster
Bitte warten ..
Mitglied: bastla
23.05.2013 um 18:18 Uhr
@ Frank

Schön wäre es in (den vielen) derartigen Fällen, wenn es möglich wäre, direkt auf
http://www.administrator.de/faq/20#toc-20457794588-28
zu verlinken ...

Grüße
bastla
Bitte warten ..
Mitglied: Frank
23.05.2013 um 18:22 Uhr
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
Bitte warten ..
Mitglied: Biber
23.05.2013, aktualisiert um 18:29 Uhr
@ bastla
Oder alternativ zu verlinken auf http://www.administrator.de/faq/36

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
Bitte warten ..
Mitglied: Andi4hu
28.05.2013 um 09:06 Uhr
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.

01.
Goto :EOF 
02.
REM ////////////////////////////////////////////////////////////////////////// 
03.
REM ///////         DeleteEmptyDirectories                 /////////////////// 
04.
:DeleteEmptyDirectories 
05.
REM Verzeichnisparameter wurde in aufrufender Routine gesetzt. 
06.
%TRACE% Jetzt in DeleteEmptyDirectories in _amProcLib %0 %TEEME% 
07.
%TRACE% Leere Unterverzeichnisse in %am_DirectoryWhereToDeleteEmptyDirs% werden nun gelöscht^.^.^. %TEEME% 
08.
if {%TRACE%}=={echo} echo. %TEEME% 
09.
 
10.
 
11.
REM /////////////////////////////////////////////////////////////////////////////// 
12.
REM //////////////     ITERATE DIRECTORY FOR    /////////////////////////////////// 
13.
REM //////////////      EMPTY SUBDIRECTORIES      ///////////////////////////////// 
14.
REM //////////////       AND DELETE THEM      ///////////////////////////////////// 
15.
REM /////////////////////////////////////////////////////////////////////////////// 
16.
 
17.
 
18.
set am_CounterDeletedFolders=0 
19.
for /f "delims=" %%i in ('dir %am_DirectoryWhereToDeleteEmptyDirs% /s/b/ad ^| sort /r') do ( 
20.
::echo Testing whether %%i is empty and can be deleted %TEEME% 
21.
REM Achtung - Prozentii muss immer in Anführungszeichen gehalten werden, wegen etwaiger Leerzeichen im Pfad. 
22.
	dir /B /A:-D "%%i" 2>&1 || ( 
23.
    echo "%%i" contains no files %TEEME% 
24.
		dir "%%i" /s /b /ad |find /v "" /C >nul 2>&1|| ( 
25.
		  echo Folder "%%i" contains neither Files nor Subfolders and will be deleted now ^.^.^. %TEEME% 
26.
		  set /A am_CounterDeletedFolders +=1 
27.
		  rd "%%i" >>%LOG% 2>>&1 
28.
		  if {%TRACE%}=={echo} echo. %TEEME% 
29.
		)   
30.
31.
32.
REM Hinter die rd-Zeile noch den Errorlevel einzufangen geht nicht, da EnableDelayedExpansion nicht benutzt wird. 
33.
::  set amErrorlevelDelDir=%errorlevel% 
34.
::  echo amErrorlevelDelDir=%amErrorlevelDelDir% %TEEME% 
35.
if {%TRACE%}=={echo} echo. %TEEME% 
36.
echo /////////////////////////////////////////////////////////////////////////////////// %TEEME% 
37.
echo ///////   Zusammenfassung von DeleteEmptyDirectories in _amProcLib   ////////////// %TEEME% 
38.
echo ///////         Es wurden insgesamt %am_CounterDeletedFolders% leere Ordner entfernt.         ////////////// %TEEME% 
39.
echo /////////////////////////////////////////////////////////////////////////////////// %TEEME% 
40.
if {%TRACE%}=={echo} echo. %TEEME% 
41.
%TRACE% Wir verlassen nun die Sub-Routine DeleteEmptyDirectories ^(remove directory^) %TEEME% 
42.
GoTo :EOF
Cheers,
Andi
Bitte warten ..
Mitglied: Andi4hu
28.05.2013 um 09:11 Uhr
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
Bitte warten ..
Mitglied: Frank
28.05.2013, aktualisiert um 09:17 Uhr
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
Bitte warten ..
Mitglied: Andi4hu
28.05.2013 um 09:19 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Visual Studio
gelöst Remotedienst prüfen mit Visual Basic (1)

Frage von flyingmichael zum Thema Visual Studio ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...