fresh-m
Goto Top

Batch zum loeschen leerer Ordner

Hallo Zusammen,

habe vom netten Bastla einen Batch Code gefunden. Diese soll aber nur dann leere Ordner und Unterodner löschen, wenn sich in keinem der Ordner eine Datei befindet.

Also:

Basisordner 1
Unterordner 1
Unterordner 2 --> Ordner 1 wird komplett gelöscht, da auch keine Datei in den Unterordnern ist
Unterordner 3

Basisordner 2
Unterordner 1
(Datei vorhanden)
Unterordner 2
(Keine Datei vorhanden) --> Ordner 2 und deren Unterordner (auch wenn einige leer sind) werden "nicht" gelöscht, da in
einem der Unterordner eine Datei vorhanden ist
Unterordner 3
(Keine Datei vorhanden)

Basisordner 3
Unterordner 1
Unterordner 2 --> Ordner 3 wird komplett gelöscht, da auch keine Datei in den Unterordnern ist
Unterordner 3
usw.

Die Ordner haben die gleiche Struktur.

Anbei der Code von Bastla, der etwas modifiziert werden müsste.

@echo off & setlocal
set D=%temp%\DelEmptyFolders.vbs
echo DeleteEmptyFolders(CreateObject("Scripting.FileSystemObject").GetFolder(WScript.Arguments(0)))>%D%
echo Sub DeleteEmptyFolders(Ordner):For Each Unter In Ordner.SubFolders:DeleteEmptyFolders(Unter)>>%D%
echo If (Unter.SubFolders.Count+Unter.Files.Count)=0 Then:Unter.Delete:End If:Next:End Sub>>%D%
cscript //nologo %D% "%~dp0"
del %D%

Ich hoffe ihr könnt mir helfen.

Gruß
fresh-m

Content-Key: 189208

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

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

Member: Darkprodukt
Darkprodukt Aug 07, 2012 at 13:21:44 (UTC)
Goto Top
Hallo fresh-m,

Ich will nur mal kurz anmerken, dass das keine Batch richtige ist.

Das ist eine Batch die ein VBS Skript schreibt, was dan die aufgabe löst und danach wieder gelöscht wird.
Wiso eigentlich so umständlich? Mach doch gleich eine VBS Datei.

Da ich mich mit VBS leider nicht auskenne kan ich nicht leider nicht Helfen, dachte ja auch es sei ein Batch Problem...

Grüße
Darkprodukt
Member: pieh-ejdsch
pieh-ejdsch Aug 07, 2012 at 15:11:19 (UTC)
Goto Top
moin freshm,

Dazu musst Du aber sagen ab welcher Tiefe gelöscht werden soll:

@echo off
setlocal
set "Wurzel=D:\"  
 rem "Ordner\Unterordner\UnterUnterOrdner" entspricht UnterUnterOrdner=3  
set /a loescheAbBasisInTiefe = 3

set /a end = loescheAbBasisInTiefe
pushD "%Wurzel%"  
:Sub
if %loescheAbBasisInTiefe% gtr 0 for /d %%i in (*) do (set /a loescheAbBasisInTiefe-=1
  pushD "%%~i"  
  set "Del="  
  call :sub
  popD
  if defined Del @echo rd /s /q "%%~i"  
  set /a loescheAbBasisInTiefe+=1
)

if %loescheAbBasisInTiefe% equ %end% popD
if %loescheAbBasisInTiefe% gtr 0 exit /b
dir /s /b /a-d |find /v "" <nul || set "Del=1"  
exit /b

Gruß Phil
Member: bastla
bastla Aug 07, 2012 at 21:26:33 (UTC)
Goto Top
Hallo PH!

Sehr hybsch ... face-smile

Grüße
bastla
Member: bastla
bastla Aug 07, 2012 at 21:42:35 (UTC)
Goto Top
Hallo fresh-m!

Wenn ich das richtig interpretiere, geht es nicht darum, ev leere Unter-/UnterUnterordner zu löschen, sondern es soll für jeden Basisordner nur ein "alles oder nichts" geben: Löschen des Basisordners, wenn es darunter keine einzige Datei gibt, oder die gesamte Ordnerstruktur behalten, wenn auch nur eine einzige Datei existiert - wenn ja, dann ginge das einfacher (zum Testen direkt in CMD, daher jeweils nur "%i" anstatt wie im Batch "%%i":
for /d %i in ("D:\*") do @dir /s/b/a-d "%i">nul 2>nul||echo rd /s /q "%i"  
Natürlich kannst Du "D:\" entsprechend anpassen, sodass auf einer tieferen Ebene begonnen wird - vor dem * muss aber immer ein \ stehen.

So wie im Vorschlag von PH ist auch hier ein "Sicherheits-echo" eingebaut, damit Du gefahrlos testen kannst, da so die Löschbefehle nur angezeigt, aber nicht ausgeführt werden ...

Grüße
bastla
Member: fresh-m
fresh-m Aug 08, 2012 at 07:37:25 (UTC)
Goto Top
Hallo zusammenn,

schönen dank an pieh-ejdsch und bastla. Hat alles wieder einmal super geklappt!!

Hab den Code von bastla genommen,da dieser ewtas "Leaner" ist.

Grüße
fresh-m
Member: hackyli
hackyli Aug 09, 2014 at 13:27:38 (UTC)
Goto Top
Hallo bastla, ich schon wieder face-wink

Ich habe auch den o.g. Code leicht modfiziert von Dir genutzt, um Ordner zu löschen, die keine Datei mit einer bestimmten Endung enthalten. Das funktioniert aber leider nur, wenn die Datei genau den gleichen Namen hat wie der Ordner. Was müsste ich denn ändern, um beliebige Dateinamen mit einer bestimmten Endung zu berückstigen?

Mein aktueller Code:
Member: bastla
bastla Aug 09, 2014 at 14:36:03 (UTC)
Goto Top
Hallo hackyli!

Eine Kleinigkeit wäre zu ändern (ungetestet):
for /d %%i in ("E:\Bilder\*") do dir /s/b/a-d "%%i\*.jpg" || rd /s /q "%%i"
Grüße
bastla

P.S.: Wie "Code"-Formatierung vorzunehmen ist, steht hier ...
Member: hackyli
hackyli Aug 09, 2014 at 15:01:40 (UTC)
Goto Top
Danke. Da hätte ich auch selbst drauf kommen können. Wegen dem Code habe ich verstanden. Werde ich zukünftig beachten.