Script um leere Ordner aus Mp3tag heraus zu löschen (Tools)


#1

Hi zusammen.

Ich hätte gerne ein Script, dass ich über die Tools von Mp3tag starten kann und das leere Ordner in einem Überordner löscht, den ich über Mp3tag Variabeln vorgeben möchte.
Ich glaub ich hab das auch schon geschafft, bin mir nur nicht ganz sicher ob da auch keine Fehler drin ist, weil ich von dieser Art von Programmieren wenig Ahung hab.

Das ganze ist davon abgekupfert:
http://www.computerbase.de/forum/showthread.php?t=704699

Ich hab bei Mp3tag ein Tool gemacht, dass eine .cmd Datei mit dem Code aus dem Link aufruft und die Variabel ".." (also den Pfad Ordners über dem Ordner in dem die Datei liegt).
Eine .bat Datei, wie im Link angegeben, scheint nicht zu funktionieren. Der Unterschied ist mir nicht bekannt. Ich hab einfach ausprobiert.
Ich habe den Code auch leicht umwandeln müssen:
set /p pfad=%1
scheint nicht zu funktionieren, ich wollte das hier der Pfad aus der Variabel gesetzt wird. Aber ich habe %1 dann weiter unten eingfügt, wo eigentlich %pfad% stehen sollte. Das geht dann anscheinend.

Mein Code schaut jetzt so aus:

@echo off
  
  
  rem ### Pfad, unter dem alle leeren Ordner gloescht werden sollen wird gesetzt ###
  
  set /p pfad=%1

  echo Es wurde %pfad% als Pfad angegeben.
  
  echo Starte Loeschvorgang von leeren Ordnern in %pfad%.
  
  
  rem ### Temporaeres Verzeichnis c:\temp\ wird erstellt, falls es nicht schon existiert. ###
  
  if not exist c:\temp\ md c:\temp\
  
  
  rem ### Falls noch die Datei c:\temp\tmp.txt existiert, so wird sie geloescht. ###
  
  if exist c:\temp\tmp.txt del /F /Q c:\temp\tmp.txt
  
  
  rem ### Schreibe alle Ordnerpfade in c:\temp\tmp.txt. ###
  
  dir /AD /b /s %1 >> c:\temp\tmp.txt
  
  
  rem ### Loesche alle leeren Ordner. ###
  
  FOR /F "delims=" %%i IN (c:\temp\tmp.txt) DO rd "%%i"
  
  echo Es wurde alle leeren Ordner geloescht!
  
  
  rem ### Loesche die temporaere Datei c:\temp\tmp.txt und ggf. den leeren Ordner c:\temp\ ###
  
  if exist c:\temp\tmp.txt del /F /Q c:\temp\tmp.txt
  
  if exist c:\temp\ rd c:\temp\
  
  
  pause

Wenn jemand Hinweise, Verbesserungen ode ähnliches hat bin ich dankbar. Ich hoffe ich lösche mir damit nicht ungewollt Teile meiner Musiksammlung. Der erste Teil des Codes ist wahrscheinlich überflüssig, da ich %pfad% ja jetzt nicht definiere sondern direkt einsetze.

Ein Problem, dass ich noch habe: das ganze scheint bei kyrillischen Buchstaben im Ordnernamen nicht zu funktionieren. Leider hab ich jedemenge von überflüssigen leeren Ordnern mit kyrillischen Buchstaben. Sie sind sogar der Hauptgrund warum ich mir so ein Skript gesucht habe. Es erscheint in der Eingabeaufforderung immer diese Zeile:
"Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung ist falsch."
Wer kann mir da helfen, wie schaffe ich es, dass diese Ordner auch gelöscht werden?


Ordner erstellen und Dateien verschieben
#2

Beim Löschen von Verzeichnissen mit einer Batch-Datei gibt es x Gründe, warum diese nicht funktionieren. Nur ein paar Beispiele:
a ) Leerzeichen im Verzeichnisnamen
b ) Gesetzter Schreibschutz
c ) Zugriffsberechtigungen
d ) Gesperrt durch andere Anwendungen
e ) Falscher Ausgangspunkt
etc etc.

Deshalb benutze ich für solche Tätigkeiten lieber Tools wie z.B. FileMenu Tools. Damit kann man mit einem rechtsklick in einem Ordner z.B. leere Verzeichnisse zuerst anzeigen und dann löschen lassen.
Mit diesem konfigurierbaren Tool gibt es aber noch unzählige andere Möglichkeiten, die ich in meinem Windows-Explorer nicht mehr hergeben würde:

  • MoveTo/CopyTo (mit einer History der letztbenutzten Verzeichnisse)
  • Advanced Renamer (massenhaftes Umbenennen in einem Schritt)
  • Size Of Folders grafisch darstellen
  • die Möglichkeit jedes weitere erdenkliche Tool einfach einzubinden
    und viele andere hilfreiche Dinge.

Das Tool lässt sich übrigens auch auf Deutsch umstellen, falls gewünscht.
(Und nein, ich bin in keiner Art und Weise mit dem Autor verbandelt... :sunglasses: )


#3

Vielleicht ist dieses schlanke Toolchen auch tauglich:

http://www.pcwelt.de/downloads/pcwEmptyFolder-1211678.html

Mir würde bei dem Syntaxfehler nur einfallen, dass ggf. alle Dateiangaben in Anführungsstriche müssten, um Leerzeichen zu kompensieren.
Naja und dann natürlich das leidige Thema von ANSI (Windows) vs ASCII (DOS).


#4

Vielleicht funktioniert das?

@ECHO OFF REM Batch script to delete empty folders. REM Drag and drop a folder on to this cmd file. ECHO.Remove empty folders from within folder IF "%1" EQU "" ECHO.%~dp0 IF "%1" NEQ "" ECHO.%1 ECHO. PAUSE ECHO. CD /D %1 FOR /f "delims=" %%p in ('DIR /s /b /ad ^| SORT /r') DO ( RD "%%p" 2>NUL: IF NOT EXIST %%p\NUL. echo.Removed: "%%p" ) ECHO. PAUSE

DD.20131029.0928.CET


#5

Hallo,
will eben nur mitteilen, das seit Jahren dieses Tool mein ständiger Begleiter ist.

Link

Was aber sehr komfortabel ist, das was man oben lesen kann, intern aus MP3Tag heraus.
Werden diesen Thread weiter verfolgen

good luck


#6

@DetlevD

Das funktioniert auch und scheint eine einfachere Lösung zu sein. Aber die Ordnere mit kyrillischen Buchstaben werden auch hier nicht gelöscht. Zwar kommt die Nachricht:
Remove: "C:[Pfad]??????"
wobei der Ordnername wie oben tatsächlich durch Fragezeichen ersetzt wird.
Der Ordner ist aber weiterhin da. Gibt es irgendeinen Weg, um mit der Eingabeaufforderung kyrillsiche Ordnernamen zu verwalten?


#7

Vielleicht den Ordner zuerst mit einem normalen Schriftzeichen umbenennen (Befehl MOVE) und dann löschen?
Manuell auf der DOS Kommandozeile funktioniert das, wenn man den betreffenden Ordnernamen mit den Sonderzeichen in die Zwischenablage kopiert und dann aus der Zwischenablage in das DOS Kommando einfügt.

Man kann in der Stapeldatei die DOS Codepage auf Kyrillisch einstellen.

@ECHO OFF REM Batch script to delete empty folders. REM Drag and drop a folder on to this cmd file ... REM ... or invoke it with a folderpathname as the first parameter. REM -------------------------------------------------------------- ECHO.Remove empty folders from within folder IF "%1" EQU "" ECHO."%~dp0" IF "%1" NEQ "" ECHO."%1" ECHO. PAUSE CHCP 855 >NUL: CD /D "%1" FOR /f "delims=" %%p in ('DIR /s/b/ad/-p ^| SORT /r') DO ( RD "%%p" 2>NUL: IF NOT EXIST "%%p\NUL." echo.Removed: "%%p" ) ECHO. CHCP 850 >NUL: PAUSE REM -------------------------------------------------------------- REM Codepage numbers from "http://technet.microsoft.com/en-us/library/bb490874.aspx" REM Code page - Country/region or language REM 437 - United States REM 850 - Multilingual (Latin I) REM 852 - Slavic (Latin II) REM 855 - Cyrillic (Russian) REM 857 - Turkish REM 860 - Portuguese REM 861 - Icelandic REM 863 - Canadian-French REM 865 - Nordic REM 866 - Russian REM 869 - Modern Greek REM --------------------------------------------------------------

DD.20131030.1255.CET


#8

OK, Detlev, Pefekt!
Vielen lieben Dank. Weiß ich sehr zu schätzen.

Ich hoffe das ganze ist sicher. Weil wie gesagt, selbst überblicke ich diese Befehle nicht u einen Papierkorb zur Wiederherstellung gibt es ja hierbei nicht.

Das einzige das eigenartig ist, im scharzen Dialogfenster der Eingabeaufforderung werden alle vorhanden Ordner als "Removed: ..." aufgelistet. Auch jene, die Daten enthalten. Tatsächlich gelöscht werden aber nur die leeren Ordner.
Weißt du warum das so ist?


#9

Na, perfekt ist es ja nun doch nicht und das mit dem Umschalten der DOS Codepage stellt mich auch nicht zufrieden.

Nun habe ich ein VBS Skript erzeugt, das die Aufgabe vielleicht erfüllen kann (siehe Anlage), bitte testen.

RemoveEmptyFolders.vbs.txt (4.68 KB)(Achtung: Die Dateinamenendung ".txt" muss entfernt werden.)


DD.20131101.1450.CET


RemoveEmptyFolders.vbs.txt (4.68 KB)


#10

Es wird immer besser! Scheint perfekt zu funktionieren. Danke.


#11

Nach paarmaliger Anwendung stört es mich ein klein bisschen (ich weiß, ich bin pingelig), dass es doch ein gutes Stück länger dauert bis das Skript durchläuft, als bei deiner Lösung vom 30.10.

Hat das mit dem Umschalten der DOS Codepage irgendwelche Nachteile?

Und auch wenn dabei alle Ordner als gelöscht aufgelistet wurde, kann man sich darauf verlassen das es in Wirklichkeit nur die leeren trifft? Bei meinen Tests war es ja so.


#12

Das VB Skript bietet den Vorteil, dass es die Dateinamen direkt so sieht und anwendet wie sie im Windows Explorer angezeigt werden.

Du kannst das Skript etwas tunen, z. B. ...
... die Wartezeit auf 1 Sekunde setzen beim ersten Dialog (udsDisplayMessage1),
... oder den Aufruf des ersten Dialogs auskommentieren
(dann lässt sich aber der laufende Vorgang nicht abbrechen).

DD.20131104.2300.CET


#13

Und deinen Vorschlag vom 30.10.? Würdest du den nicht empfehlen?


#14

Was meinst du jetzt genau?
a) Das zuerst Umbenennen eines Ordners und dann löschen ...
... konnte ich im DOS nicht realisieren eben wegen der Codepage-Umschaltung.
b) Das DOS Skript für Kyrillisch?
Das läuft doch, oder?

DD.20132204.2318.CET


#15

beides glaub ich meine ich. ich versteh ja nicht ganz was das skript macht.
es werden alle ordner als "removed" aufgelistet". warum auch immer. das ist aber kein problem, solange in wirklichkeit nur die leeren gelöscht werden. meine frage wäre: kann ich mir sicher sein, dass ich dabei nicht aus versehen ordner mit mp3s lösche.

zu b )
das läuft. aber du hast geschrieben du seist damit nicht zufrieden. warum auch immer.


#16

Diese Textausgabe kommt nicht vom Betriebssystem, sondern aus dem Skript und soll nur zur Information dienen.
Normalerweise funktioniert die Prüfung eines Ordners betreffend die Existenz der imaginären Datei "nul.", bei deinem Anwendungsfall/deiner Festplatte aber offensichtlich nicht.
Und im Moment vermag ich nicht zu beurteilen, woran das liegt.

Der DOS RD Befehl ist insoweit sicher, weil er nur wirklich leere Ordner entfernt.

DD.20131105.0800.CET


#17

OK, Danke. Das wollt ich wissen.
Dann ist das die von mir jetzt favorisierte Methode. Weil sie am schnellsten ist u genau tut was ich will.
Die falsche Anzeige ist halb so tragisch. Spielt eigentlich keine Rolle wie die Ordner hießen, die ich eh nicht wollte.

Danke nochmal!