pireba
Goto Top

Index per Batch erstellen

Guten Tag allerseits,
ich fange an mit der Schilderung meiner Ausgangssituation:

Auf meiner externen Festplatte befinden sich meine Filme. Die Ordnerstruktur ist wie folgt:

Es gibt die Ordner von A - Z. In jedem dieser Ordner liegen Ordner mit dem Namen des Filmes. Die eigentliche .avi-Datei liegt also IMMER in einem eigenen Ordner mit dem Namen des Filmes. Beispielsweise also so:

Filme
-> A
->> Avatar
->>> Avatar.avi
->> Aviator
->>> Aviator.avi
-> B
->> Blood Diamond
->>> Blood Diamond.avi
...
Grund dafür ist, dass ich viele Filme habe, die "Beispielfilm - A.avi" und "Beispielfilm - B.avi" heißen, somit ist der übersichtlichkeit halber, jeder Film (egal aus wie vielen "Teilen" er besteht) in einem seperaten Ordner. Der Einhaltlichkeit wegen übernahm ich diese Taktik für jeden Film (auch die die aus nur einer .avi oder .mov oder welches Format auch immer bestehen).

Dann gibt es noch Filme von denen es wirklich mehrere Teile gibt und jeder Teil noch einmal aus Film - A und Film - B besteht. So wie an diesem Beispiel zu sehen:

Filme
-> H
->> Harry Potter
->>> Harry Potter 1
->>>> Harry Potter 1 - A.avi
->>>> Harry Potter 1 - B.avi
->>> Harry Potter 2
->>>> Harry Potter 2 - A.avi
->>>> Harry Potter 2 - B.avi
...
Was ich mir jetzt wünsche:
Ich möchte eine CMD-Batch-Datei erstellen, welche mehrere Bedingung beinhalten muss:

- Ich möchte keine Dateien aufgelistet bekommen, da der Ordner in denen die Filme liegen reicht. (Wie in dem Beispiel mit Avatar - Nur der Ordner Avatar und nicht Avatar.avi)

- Ich möchte wie in dem Beispiel mit Harry Potter, nicht Harry Potter UND Harry Potter 1, 2, ... aufgelistet bekommen, sondern, wenn in dem Ordner Harry Potter noch weitere Ordner liegen, dann nur die weiteren Ordner (Harry Potter 1, 2, ...).

- Ich hätte dies gerne als Batch-Skript, damit ich es ausführen kann wann ich möchte.

- Ich hätte diesen Code gerne als Übungszweck um die Thematik besser zu verstehen. Also eine Erklärung wieso genau dieser Befehl nun verwendet wurde, wäre wirklich sehr nett und hilfreich für mich.

Damit sich jetzt auch wirklich jeder vorstellen kann was ich meine, hier die Index-Datei die ich bekommen möchte (anhand der genannten Beispiele):
Avatar
Aviator
Blood Diamond
Harry Potter 1
Harry Potter 2
Ich möchte also keine Pfadangabe, keine Größe oder sonstige Informationen. Nur die Ordnernamen. Ich bekomme einfach keine Idee wie ich dieses Problem bewältigen kann... Vielleicht einer von euch?

Content-Key: 195313

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

Ausgedruckt am: 29.03.2024 um 07:03 Uhr

Mitglied: miniversum
miniversum 04.12.2012 um 12:38:30 Uhr
Goto Top
Hallo,

da Du es ja lernen möchtest werde ich die keinen code schreiben der alles schon macht sondern dir ein paar Tips geben wonach du schauen musst und was für befehle hierfür hilfreich sind.

1. dir
Der Dir Befehl listet dir Dateien und / oder Verzeichnisse auf. Hier würd eich den Befehl
dir /S /B /AD verwenden. Wofür die Parameter genau stehen erfährst du indem du in der Eingabeaufforderung
dir /? eingibst.

2. eine For Schleife (Hilfe mit for /?). Hiermit kannst Du unter anderem dir Dir Ausgabe in einzelne Teile
zerlegen. Z.B. so in der Eingabeaufforderung:
FOR /F "tokens=1,2,3,4 delims=\" %i in ('dir /s /B /AD') do @echo %i %j %k %l
bzw. so in einer Batch Datei:
FOR /F "tokens=1,2,3,4 delims=\" %%i in ('dir /s /B /AD') do @echo %%i %%j %%k %%l
Mitglied: Pireba
Pireba 04.12.2012 um 13:15:21 Uhr
Goto Top
Danke für deine schnelle Antwort.

Ich bin auf eine Lösung gekommen, die FAST meinen Ansprüchen entspricht.

for /f "delims=" %%i in ('dir /b /s "C:\Neuer Ordner\*.txt" "C:\Neuer Ordner\*.ico"') do echo %%~ni >> "%USERPROFILE%\Desktop\testtesttest.txt"

Dieser Code ist nur ein Test, deswegen auch .txt und .ico Dateien.

Die Ausgabe kommt dem sehr nahe was ich haben möchte, nur gibt er mir hier halt die Dateien aus. Durch das %%~ni zwar ohne Dateiendung aber trotzdem sind es nicht die Ordner.
Mein einziges Problem dabei ist nur, dass er mir die Filme die aus 2 Teilen bestehen ("Film ??? - A" und "Film ??? - B") auch als 2 "Indexeinträge" ausgibt.
Bei Film ??? möchte ich nicht "Film ??? - A" und "Film ??? - B" in der Liste stehen haben sondern nur "Film ???".

Mir fällt da nur die Möglichkeit ein, immer den höchsten Ordner auszugeben. Also alle Ordner in denen sich Dateien befinden. Diese Umsetzung bekomme ich nicht hin (wenn sie denn möglich ist).

Also wie gesagt ich würde mit meiner jetzigen Lösung zwar auskommen, aber schöner wäre die Ordnerausgabe allemal.

Noch einmal besten Dank.
Mitglied: pieh-ejdsch
pieh-ejdsch 04.12.2012 um 13:39:40 Uhr
Goto Top
moin Pireba,

das ist ja nun keine Anleitung. Bitte verschiebe den Beitrag.

als Einzeiler auf der CMD-line wäre es in etwa so
> for /r "D:\Verzeichnis" %i in (*.txt) do @set "B=%~ni" &cmd /von /c "2>nul md  "%~dpi!B:~0,1!\%~ni\" &if exist "%~dpi!B:~0,1!\%~ni\" (move "%~fi" "%~dpi!B:~0,1!\%~ni\") else >&2 echo Verzeichnis "%~dpi!B:~0,1!\%~ni\" konnte nicht erstellt werden! "  

Ansonsten kommt bei mir schon wieder bei diesen Gassenhauern so ein #?@%(&§#$ !

Gruß Phil
Mitglied: Pireba
Pireba 04.12.2012 um 16:23:56 Uhr
Goto Top
Hallo Phil,
ja es kann angehen, dass ich den Beitrag falsch erstellt habe. War keine Absicht.

Ich habe dein Code einmal ausprobiert (habe das "D:\Verzeichnis" in "C:\NeuerOrdner" geändert. Ansonsten begreife ich gar nichts von deinem Code.

Ausgeführt habe ich den Code direkt im CMD-Fenster und es rasselten entliche Zeilen "Verschieben erfolgreich" herunter. Am Ende ist die Ordnerstruktur meines Testordners folgende:

A -> Aviator -> A -> Aviator -> A -> Aviator -> A -> Aviator -> A und immer so weiter.

Also entweder brauche ich eine genauere Anleitung wie ich den Code abzuändern habe oder der funktioniert schlicht und einfach nicht.

Trotzdem Danke für die Mühe.
Mitglied: miniversum
miniversum 04.12.2012 um 19:36:04 Uhr
Goto Top
Das wars ja schon fast. Ich hab das ganze nur um eine Stufe erweitert und nicht nach Dateien gesucht:
for /f "delims=" %%i in ('dir /b "C:\Neuer Ordner"') do echo Buchstabe: %%i  & for /f "delims=" %%j in ('dir /b "C:\Neuer Ordner\%%i"') do echo %%~nj >> "%USERPROFILE%\Desktop\testtesttest.txt"  
Mitglied: Pireba
Pireba 05.12.2012 um 08:01:30 Uhr
Goto Top
Hey miniversum,
vielen vielen Dank. Ich habe den Code ausprobiert und alles war wunderbar.
Doch dann stellte ich leider fest, und das ist auch ganz klar wenn ich mir mal den Code anschaue, dass die Ordnerstruktur die ich oben erwähnt habe, nicht ganz richtig "abgeschrieben" wurde.

Ich meine das Beispiel mit Harry Potter... Die Ordnerstruktur sieht so aus:

H -> Harry Potter -> Harry Potter 1 -> Harry Potter 1.avi

Normale Filme so:

A -> Aviator -> Aviator.avi

Filme wie Harry Potter oder Herr der Ringe haben eine Ordnerebene mehr. Das muss ich noch irgendwie mit einer IF-Anfrage automatisieren.
Also wenn sich keine Datei sondern noch ein Ordner im aktuellen Ordner befindet, dann noch eine Ebene tiefer. So weit die Theorie...

Den Code habe ich außerdem nicht zu 100% begriffen.
Was ist "delims=" ?
Wieso sagst du: "echo Buchstabe: %%i" ?
Wieso kannst du 2 FOR-Schleifen mit einander verbinden? Im Internet steht immer das ginge nur mit dem Befehl "CALL" ?
Wie kann ich dort jetzt eine IF-Schleife einbauen und wo müsste sie hin?

So das wär's dann erstmal...

Trotzdem vielen vielen Dank ich bin endlich ein großes Stück weiter gekommen durch deine Hilfe =)
Mitglied: miniversum
miniversum 05.12.2012 um 14:31:16 Uhr
Goto Top
Hallo,

delims gibt das Trennzeichen in der For Schleife an an. Standardmäßig ist das ein Leerzeichen. Da ich das nicht möchte gebe ich hier an das es kein Trennzeichen gibt ("delims=")
Das "echo Buchstabe: %%i" was nur als Anzeige gedacht zum nachvollziehen
Aber nur weil was im Internet steht heißt das ja nicht das es stimmen muss. Wie du siehst kannst du For Schleifen in einander Schachteln.

Dies hier sollte nun aber funktionieren:
@echo off

for /f "delims=" %%a in ('dir /AD /b "C:\Neuer Ordner"') do for /f "delims=" %%b in ('dir /AD /b "C:\Neuer Ordner\%%a"') do (  
dir /A-D /b "C:\Neuer Ordner\%%a\%%b" >NUL 2>NUL && echo %%b >> "%USERPROFILE%\Desktop\testtesttest.txt"  
dir /A-D /b "C:\Neuer Ordner\%%a\%%b" >NUL 2>NUL || for /f "delims=" %%c in ('dir /AD /b "C:\Neuer Ordner\%%a\%%b"') do echo %%c >> "%USERPROFILE%\Desktop\testtesttest.txt"  
)

Zur Beschreibung:
Das ganze läuft so ab:
Z3.1: for /f "delims=" %%a in ('dir /AD /b "C:\Neuer Ordner"') do -> alle Ordner der ersten Ebene (Buchstaben) werden durchlaufen ...
Z3.2: for /f "delims=" %%b in ('dir /AD /b "C:\Neuer Ordner\%%a"') do -> alle Unterordner der ersten Ebene werden durchlaufen (Filmtitel) ...
Z4.1: dir /A-D /b "C:\Neuer Ordner\%%a\%%b" -> Es wird geprüft ob in jedem Ordner der zweiten Ebene direkt eine Datei liegt.
Z4.2: >NUL 2>NUL -> Unterdrückt die Ausgabe (egal ob Dateien existieren oder nicht)
Z4.3: && Bei Nicht Fehler (also Dateien vorhaben ...
Z4.4: echo %%b >> "%USERPROFILE%\Desktop\testtesttest.txt" -> ... wird der Ordnername der zweiten Ebene in die Datei geschrieben
Z5.1: dir /A-D /b "C:\Neuer Ordner\%%a\%%b" -> Es wird geprüft ob in jedem Ordner der zweiten Ebene direkt eine Datei liegt.
Z5.2: >NUL 2>NUL -> Unterdrückt die Ausgabe (egal ob Dateien existieren oder nicht)
Z5.4: for /f "delims=" %%c in ('dir /AD /b "C:\Neuer Ordner\%%a\%%b"') do -> gehe eine Unterordner Ebene tiefer und ...
Z5.5: echo %%c >> "%USERPROFILE%\Desktop\testtesttest.txt" -> ... es wird der Ordnername der dritten Ebene in die Datei geschrieben
Mitglied: Pireba
Pireba 06.12.2012 um 23:21:34 Uhr
Goto Top
Guten Abend miniversum,
vielen vielen Dank. Jetzt klappt es perfekt face-smile

Nur falls es dich interessiert:
Da ich die externe Festplatte, auf der meine Filme liegen, auch an einem Mac benutze, gibt es unsichtbare Systemdateien in jedem Ordner. In Zeile 4.1 wird also immer eine Datei gefunden und er gibt den Ordnernamen der Ebene 2 aus. Er geht also nie in Ebene 3 runter. Zeile 4.1 und 5.1 müssten so anfangen:
dir /A-D-H /B ...

Nun ignoriert er nur unsichtbare Dateien und Ordner.

Aber trotzdem wirklich 1000 Dank!