Geschrieben von 0-checka am 01.02.2006, 17:36

Aufgrund einer Frage im Forum und einer kurzen Diskussion über Umständlichkeit, habe ich mich dazu berufen gefühlt, die möglichst bequemste Lösung mit den simpelsten Mitteln zu schaffen.
Die Frage aus dem Forum:
"Ich hab da eine frage kann einer von euch mir vll dabei helfen, wie ich von einem Ordner alle darin enthalten Dateien in einer Datenbank automatisch eintragen lassen kann? Dies mein ich speziel bei MP3 und WMA Dateien. Falls jemand was davon hat oder mir vll auf die sprünge helfen kann dann wäre ich super dankbar. Die Datenbank sollte am Besten MySQL sein."

Und hier meine Lösung:
Ich habe eine Batchdatei programmiert, die mehrere Dateien erstellt und mit deren Hilfe die gesamte Aufgabenstellung übernimmt. Hier eine kurze Beschreibung der Aufgaben, die die erstellten Dateien übernehmen (Namen in dieser Liste identisch mit den Variablennamen für diese Dateien im "Quellcode"):
DIRLIST: Diese Datei enthält einfach nur eine Liste aller Unterverzeichnisse des MP3-Ordners
SQLFILE: Diese Datei ist das SQL-Skript, das die Tabelle erstellt und die Daten einfügt
SQLBATCH: Diese Datei ruft mysql.exe mit den benötigten Parametern (u.a. dem SQL-Skript) auf
HELPERBATCH: Diese Datei sucht die Dateien aus einem Verzeichnis heraus und erstellt mit jeder einzelnen ein INSERT-Statement im SQL-Skript

Die Hauptdatei, deren "Quelltext" hier gelistet ist, erstellt diese Dateien immer automatisch und löscht sie am Schluss wieder aus dem Temp-Verzeichnis.

Das Problem mit Batch-Dateien unter Windows ist, dass man keine komplexen Programmstrukturen aufbauen kann. Diese Hürde wurde in diesem Fall durch das Erstellen der temporären Hilfsdateien umgangen. Beim Erstellen der Hilfsdateien ist vor allem eines schwierig: die benötigten Operatoren (z.B. % oder >) per ECHO-Befehl da rein zu bekommen. Für komplexe Batch-Dateien sind vor allem die drei Befehle FOR, IF und GOTO am wichtigsten. Wie FOR funktioniert, wird hier an zwei Stellen unterschiedlich demonstriert. Für IF und GOT gab es keine grösseren Verwendungsmöglichkeiten, aber die sind auch relativ einfach zu begreifen und man sieht hier die möglichen Ansätze für komplexere Strukturen mit den beiden Befehlen.

Bevor ich auf das Skript näher eingehe, hier noch einige Systemvoraussetzungen:
- Win2K oder WinXP (WinNT sollte meiner Meinung nach auch gehen)
- Aktivierte Befehlserweiterungen für cmd.exe (standardmässig aktiviert)
- Das Programm mysql.exe (im bin-Verzeichnis jeder MySQL-Installation zu finden)
Falls jemand kein MySQL installiert hat auf seinem Rechner und auch keine Lust hat, es zu tun, so kann er sich unter folgendem Link das Programm runterladen: http://0-checka.de/mysql-for-lima.zip (da müsste auch das Backup-Programm mysqldump mit bei sein, wenn ich mich richtig erinnere).

Noch einige Anmerkungen zu den Variablen, die angelegt werden:
Die unter DB-Infos sollten klar sein, es geht um die Verbindungsdaten zur MySQL-DB. Müssen natürlich angepasst werden.
Unter Tabelleninfos kann man sich einen Tabellennamen und eine Spalte aussuchen. Achtung: Die Tabelle wird bei jeder Ausführung des Skripts komplett gelöscht und neu angelegt, daher sollte man keine bestehende verwenden, ausser man weiss, was man tut.
Unter Sonstiges wird es interessant. MP3DIR und MP3FOLDER ergeben zusammen den vollständigen Pfad zum Hauptverzeichnis, wo die MP3-Dateien liegen. Die beiden Variablen müssen in genau der Form erstellt werden, also MP3DIR als Partitionsbuchstabe mit abschliessendem Doppelpunkt und MP3FOLDER als voller Pfad nach dem Doppelpunkt ohne abschliessenden Backslash. Die vier folgenden Variablen (DIRLIST, SQLFILE, SQLBATCH und HELPERBATCH) braucht man nicht abzuändern, es sei denn, es gibt irgendwelche Komplikationen mit anderen gleichlautenden Namen. Sollte man sie abändern, braucht man keine Dateiendungen anzufügen, da sie im Skript "hartkodiert" sind. Man sollte bei maximal 8 Buchstaben bleiben und keine Leerzeichen benutzen. Die Variable MYSQLBINPATH wird nur gebraucht, wenn entweder bei der MySQL-Installation das bin-Verzeichnis nicht in PATH eingetragen wurde (wird es aber eigentlich immer) oder wenn ihr das von mir bereitgestellte Programm benutzt. MYSQLBINPATH muss den vollständigen Pfad zu dem Ordner enthalten, der die Datei mysql.exe beinhaltet. Der Pfad muss mit einem Backslash abschliessen.

Mit den ganzen Infos und den Kommentaren im Skript sollte das Ganze eigentlich relativ leicht verständlich sein.

----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------

LEIDER WERDEN EINIGE ZEILEN UMGEBROCHEN, WAS IN EINER BATCHDATEI NATÜRLICH NICHT OK IST. ABER ANDERS KRIEGE ICH ES HIER IM SYSTEM NICHT HIN (CODE-TAG GEHT NICHT, WEGEN DER BACKSLASHS AN "VERBOTENEN" STELLEN. AM BESTEN DEN CODE KOMPLETT MARKIEREN UND IN EINEN EDITIOR KOPIEREN. DANN VERSCHWINDEN DIE ZEILENUMBRÜCHE.

Sind nur 3 Stellen, wo die Zeilen umgebrochen sind:
2. Zeile nach dem Kommentar "SQL-Skript vorbereiten", beginnt mit "echo CREATE TABLE"
3. Zeile nach dem Kommentar "Temporaeres Befehlsskript erstellen", beginnt mit "echo for /r"
2. Zeile nach dem Kommentar "Batch-Datei zum Ausfuehren des SQL-Skripts erstellen", beginnt mit "echo %MYSQLBINPATH%"

@echo off

REM --- Erstmal der Bequemlichkeit halber paar Variablen festlegen ---

REM --- DB-Infos ---
SET DBSERVER=mysql.lima-city.de
SET DBNAME=dbname
SET DBUSER=dbusername
SET DBPASS=dbuserpasswort

REM --- Tabelleninfos ---
SET MP3TABLE=irgendeintabellenname
SET MP3COLUMN=irgendeinnamefuerdiespalte

REM --- Sonstiges ---
SET MP3DIR=e:
SET MP3FOLDER=\music
SET DIRLIST=mp3dirs
SET SQLFILE=mp3data
SET SQLBATCH=mp3up
SET HELPERBATCH=mp3temp
SET MYSQLBINPATH=

echo.
echo.
echo.
echo            +++++++++++++++++++++++++++++++++
echo            +++                           +++
echo            +++   0-checka ist der King   +++
echo            +++                           +++
echo            +++++++++++++++++++++++++++++++++
echo.
echo.
echo.

REM --- Kurz was checken ---
if not exist %MP3DIR%%MP3FOLDER% goto QUARK

REM --- Verzeichnisliste des MP3-Ordners erstellen ---
dir /ad /s /b %MP3DIR%%MP3FOLDER% > %TEMP%\%DIRLIST%.txt
echo Verzeichnisliste erstellt...

REM --- SQL-Skript vorbereiten ---
echo DROP TABLE IF EXISTS `%MP3TABLE%`; > %TEMP%\%SQLFILE%.sql
echo CREATE TABLE `%MP3TABLE%` (`id` int(10) NOT NULL AUTO_INCREMENT, `%MP3COLUMN%` varchar(300), PRIMARY KEY (`id`)); >> %TEMP%\%SQLFILE%.sql
echo Header fuer SQL-Skript erstellt...

REM --- Temporaeres Befehlsskript erstellen ---
echo %MP3DIR% > %TEMP%\%HELPERBATCH%.cmd
echo cd %%1 >> %TEMP%\%HELPERBATCH%.cmd
echo for /r . %%%%a in (*.mp3) do echo insert into %MP3TABLE% (%MP3COLUMN%) values ("%%%%~na"); ^>^> %TEMP%\%SQLFILE%.sql >> %TEMP%\%HELPERBATCH%.cmd
echo echo Daten aus Verzeichnis %%1 verarbeitet... >> %TEMP%\%HELPERBATCH%.cmd
echo Temporaeres Befehlsskript erstellt...

REM --- Aufruf des temoraeren Befehlsskripts mit den Daten aus der Verzeichnisliste ---
for /f %%a in (%TEMP%\%DIRLIST%.txt) do call %TEMP%\%HELPERBATCH%.cmd %%a

REM --- Unterverzeichnisse des MP3-Verzeichnisses wurden verarbeitet,
REM --- nun ist das MP3-Verzeichnis selber dran
call %TEMP%\%HELPERBATCH%.cmd %MP3DIR%%MP3FOLDER%
echo Erstellung des SQL-Skriptes abgeschlossen...

REM --- Batch-Datei zum Ausfuehren des SQL-Skripts erstellen ----
echo @echo off > %TEMP%\%SQLBATCH%.cmd
echo %MYSQLBINPATH%mysql -h %DBSERVER% -u %DBUSER% -p%DBPASS% -e "\. %TEMP%\%SQLFILE%.sql" %DBNAME% >> %TEMP%\%SQLBATCH%.cmd
echo if errorlevel 1 goto :ERRPRINT >> %TEMP%\%SQLBATCH%.cmd
echo echo DB-Upload abgeschlossen... >> %TEMP%\%SQLBATCH%.cmd
echo goto FERTIG >> %TEMP%\%SQLBATCH%.cmd
echo :ERRPRINT >> %TEMP%\%SQLBATCH%.cmd
echo echo Fehler beim Upload in die DB >> %TEMP%\%SQLBATCH%.cmd
ECHO :FERTIG >> %TEMP%\%SQLBATCH%.cmd

REM --- Batch-Datei ausfuehren, abwarten und Tee trinken ---
echo Beginne Upload in DB (kann dauern)...
call %TEMP%\%SQLBATCH%.cmd

goto ZUENDE

:QUARK
echo MP3-Verzeichnis nicht gefunden

:ZUENDE
echo.
pause

REM --- Noch kurz aufraeumen ---
del %TEMP%\%SQLBATCH%.cmd
del %TEMP%\%HELPERBATCH%.cmd
del %TEMP%\%DIRLIST%.txt
del %TEMP%\%SQLFILE%.sql


----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------

Viel Spass beim Erweitern des Skripts (z.B. die Tabelle in der DB besser gestaltetn und noch mehr Infos automatisch eintragen). Bitte den Banner nicht entfernen, sondern jedesmal beim Benutzen des Skriptes ehrfürchtig betrachten. Danke.

Bewertung Anzahl
6
100,0 %
2 Bewertungen