WinFuture-Forum.de: Leere Ordner finden - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
  • 2 Seiten +
  • 1
  • 2

Leere Ordner finden


#1 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 11. Januar 2016 - 20:45

Guten Abend erstmal :)
Ich bin jetzt ein neuer "Frischling" in diesem Forum, also korrigiert mich bitte, fals ich etwas falsch mache.

Ich hatte letztens die Idee eine Batch zu programmieren, die alle leeren Ordner findet und evt. auch löschen sollte (je nachdem wo sich die Ordner befinden).

@echo off
mode con cols=102 lines=50
title EmptyDirectoriesDeleter
setlocal EnableExtensions EnableDelayedExpansion
color a
cls

set empty=0
cd C:\
set alldirectories=0
echo Scanning
for /f %%a in ('dir /s /b /ad') DO (
set /a alldirectories=!alldirectories!+1
)
echo Initalizing
for /l %%b in (1,1,100) DO (
set b=%%b
set /a a!b!=!alldirectories!/!b!
)
set scanneddirectories=0
echo Second Scanning
for /f %%i in ('dir /s /b /ad') DO (
set /a scanneddirectories=!scanneddirectories!+1
for /l %%c in (1,1,100) DO (
set c=%%c
set int=a+%%c
if %int% GEQ !scanneddirectories! (
set b!c!=²
) else (
set b!c!=°
)
)
cls
echo ³!b1!!b2!!b3!!b4!!b5!!b6!!b7!!b8!!b9!!b10!!b11!!b12!!b13!!b14!!b15!!b16!!b17!!b18!!b19!!b20!!b21!!b22!!b23!!b24!!b25!!b26!!b27!!b28!!b29!!b30!!b31!!b32!!b33!!b34!!b35!!b36!!b37!!b38!!b39!!b40!!b41!!b42!!b43!!b44!!b45!!b46!!b47!!b48!!b49!!b50!!b51!!b52!!b53!!b54!!b55!!b56!!b57!!b58!!b59!!b60!!b61!!b62!!b63!!b64!!b65!!b66!!b67!!b68!!b69!!b70!!b71!!b72!!b73!!b74!!b75!!b76!!b77!!b78!!b79!!b80!!b81!!b82!!b83!!b84!!b85!!b86!!b87!!b88!!b89!!b90!!b91!!b92!!b93!!b94!!b95!!b96!!b97!!b98!!b99!!b100!³
echo.
echo Scanned Directories: !scanneddirectories!
echo Empty Directories: !empty!
echo.
echo All Directories: !alldirectories! 
cd "%%i"
dir | find "0 Datei(en)" >nul
if %ERRORLEVEL%==0 (
dir | find "2 Verzeichnis(se)" >nul
if ERRORLEVEL 1 (
echo %%i >> %userprofile%\Desktop\empty_directories.txt
set /a empty=!empty!+1
)
)
)
cls
del %userprofile%\Desktop\empty_directories.txt
echo !empty! leere Verzeichnisse wurden gefunden
pause


Fals ich was falsch geschrieben haben sollte, beachtet es einfach nicht.

Das Programm stoppt aber immer bei:

if %int% GEQ !scanneddirectories!


Grund: "!scanneddirectories!" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
2. Grund: Die Variable "int" hat keinen Wert.

Danke für jede Hilfe schonmal im Voraus ;)
0

Anzeige



#2 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 11. Januar 2016 - 21:34

Willkommen im Forum!

Erstens muss es setlocal EnableDelayedExpansion heißen und nicht setlocal EnableExtensions EnableDelayedExpansion, damit !scanneddirectories! usw funktionieren.

Desweiteren wozu ³,°, ² ?
Die echo !b! Zeile lässt sich noch um einiges optimieren, aber solange es erstmal geht.

Allgemein ist es keine gute Idee einfach so leere Ordner zu löschen, denn auch leere Ordner können wichtig seien, nur wegen der Existens her.
Speicherplatz bringt es dir auch keinen, also wozu die Arbeit?
1

#3 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 11. Januar 2016 - 22:05

Danke d4rkn3ss4ev3r für die schnelle Antwort.

Ich weis gerade selbst nicht mehr für wieso ich die Erweiterungen aktiviert habe.
Ja die lange Schreiberei wollte ich eigentlich in eine For Schleife verpacken, allerdings gab es dabei auch ein paar Probleme.
Die Zeichen ³,° und ² sollen eine "Prozentbar" animieren, um das ganze grafisch besser darzustellen

Ich will ja auch keine System/Programm Ordner löschen, sondern einfach Überbleibsel von alten Arbeiten, da zumindestens ich viele leere, unnötige Ordner habe.

Natürlich kann man einfach ein Programm, wie z.B. CCleaner dafür herunterladen, aber Programmieren macht mehr Spass ;)

Vielen Dank d4rkn3ss4ev3r für deine Hilfe

Edit: Es gibt immer noch die gleichen Fehler aus.

Dieser Beitrag wurde von Schwarzbeere bearbeitet: 11. Januar 2016 - 22:10

0

#4 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 11. Januar 2016 - 22:09

Achso, ok.

Das setzen der EnableDelayedExpansion ist okay und in deinem Fall sogar notwendig. Nur hast du es falsch geschrieben.
0

#5 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 11. Januar 2016 - 22:14

An so einen Fehler habe ich auch schon gedacht.
Anscheinend bin ich gerade zu blind um das Problem zu sehen.
Was habe ich denn falsch geschrieben?
0

#6 Mitglied ist offline   RalphS 

  • Gruppe: aktive Mitglieder
  • Beiträge: 8.887
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

geschrieben 11. Januar 2016 - 23:29

Gegenvorschlag:

1. Index über alle Ordner erstellen mit dir /AD/S/B (zB nach D.txt)
2. Index über alle Dateien erstellen mit dir /A-D/S/B (zB nach F.txt)
3. Abgleichen. Wenn ein Eintrag in D.txt auch in F.txt auftaucht, war der Ordner nicht leer.

Das macht die Sache flexibler, einfacher und übersichtlicher.

Alternativ: FIND aus dem findutils-Paket verwenden (GNU-Tool), egal woher (mingw, msys2, sonstwo).

Dann wird das Ganze so simpel wie ein
find [pfad] -type d -empty
.
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#7 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 12. Januar 2016 - 09:54

 Zitat (Schwarzbeere: 11. Januar 2016 - 22:14)

Was habe ich denn falsch geschrieben?

Siehe meinen Post oben.

Zitat

Erstens muss es setlocal EnableDelayedExpansion heißen und nicht setlocal EnableExtensions EnableDelayedExpansion, damit !scanneddirectories! usw funktionieren.

0

#8 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 12. Januar 2016 - 18:31

Danke euch beiden für eure Antworten.

RalphS: Deine 1. Variante würde bei mir pro Ordner ca. 10 Minuten dauern, was viel zu lange wäre.
Deine 2. Variante benötigt ein "Zusatzprogramm", wobei ich doch genau das vermeiden will.

d4rkn3ss4ev3r: Ich habe bereits nach deinem 1. Post den "setlocal" Befehl geändert. Die Batch beendet sich jedoch immer noch mit derselben Fehlermeldung.

Jetzt, da man gerade ein so schönes Problem gefunden hat, werde ich weiter versuchen den / die Fehler zu finden.

Es wäre schon wenn ihr mir weiter helft.
0

#9 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 12. Januar 2016 - 19:08

Dann füge eine Zeile mit @echo off rein um Fehler in der Batch zu sehen.
0

#10 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 12. Januar 2016 - 19:12

Du meinst wohl eher (@)echo on.
Der Fehler wird von der If-Abfrage ausgelöst.

if %int% GEQ !scanneddirectories! (


Die Fehlermeldungen habe ich schon bei meinem ersten Beitrag erwähnt.
0

#11 _d4rkn3ss4ev3r_

  • Gruppe: Gäste

geschrieben 12. Januar 2016 - 19:57

Meinte ich, sorry, verschrieben.

Probiere mal if "%int%" GEQ "!scanneddirectories!"
0

#12 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 12. Januar 2016 - 20:51

Ich denke mal, dass dann das "GEQ", also =< nicht funktionieren wird, da die Zahl jetzt als String erkannt wird.
Aber wird ja nicht schaden.
0

#13 Mitglied ist offline   Sturmovik 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.790
  • Beigetreten: 10. Januar 08
  • Reputation: 445
  • Geschlecht:unbekannt
  • Wohnort:In Reichweite der Kaffeemaschine
  • Interessen:IT, Luftfahrt, historische Technik

geschrieben 12. Januar 2016 - 21:30

Oje is das kompliziert in Windows.

In Linux wär das ein einfaches
find /pfad -type d -empty -exec rmdir {} \;


Eventuell funktioniert das ja auch unter Windows mit den GNU Findutils?
http://gnuwin32.sour...s/findutils.htm

Dieser Beitrag wurde von Sturmovik bearbeitet: 12. Januar 2016 - 21:34

«Geschichte wiederholt sich nicht, aber sie reimt sich» (Mark Twain)

Unix won't hold your hand. You wanna shoot your foot, Unix reliably delivers the shot.

True Cloudstorage
0

#14 Mitglied ist offline   Schwarzbeere 

  • Gruppe: Mitglieder
  • Beiträge: 8
  • Beigetreten: 11. Januar 16
  • Reputation: 0

geschrieben 12. Januar 2016 - 21:34

Ich glaube ich habe das Problem jetzt gefunden:

Der "setlocal enabledelayedextensions" wird nicht beachtet, da alle Variablen die mit "!" gekennzeichnet sind, nicht als Variable erkannt werden.
Daher müsste die Variable "int" ein String sein und auch als solcher ausgegeben werden, sie ist aber einfach als "nichts" definiert (wie kriegt man sowas hin?) und demnach wird auch kein "Text" sondern einfach "nichts" ausgegeben.

Aber zurück zu dem "setlocal" Befehl. Obwohl er anscheinend nicht ausgeführt wird / es wahrscheinlich einen Fehler gab, gibt es weder eine Fehlermeldung noch beträgt die Variable ERRORLEVEL den Wert 1, der normalerweise bei einem Fehler festgelegt wird.

Langsam blick ich nicht mehr durch -_-
0

#15 Mitglied ist offline   DK2000 

  • Gruppe: Administration
  • Beiträge: 19.718
  • Beigetreten: 19. August 04
  • Reputation: 1.435
  • Geschlecht:Männlich
  • Wohnort:Oben auf dem Berg
  • Interessen:Essen, PC, Filme, TV Serien...

geschrieben 12. Januar 2016 - 22:22

 Zitat (Schwarzbeere: 12. Januar 2016 - 21:34)

Der "setlocal enabledelayedextensions" wird nicht beachtet, da alle Variablen die mit "!" gekennzeichnet sind, nicht als Variable erkannt werden.

Ja, weil er immernoch falsch geschrieben ist.

Nicht EnableDelayedExtensions, sondern EnableDelayedExpansion, also

Setlocal EnableDelayedExpansion
Ich bin kein Toilettenpapier-Hamster.
---
Ich bin ein kleiner, schnickeldischnuckeliger Tiger aus dem Schwarzwald.
Alle haben mich ganz dolle lila lieb.
0

Thema verteilen:


  • 2 Seiten +
  • 1
  • 2

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0