Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Index per Batch erstellen

Frage Entwicklung Batch & Shell

Mitglied: Pireba

Pireba (Level 1) - Jetzt verbinden

04.12.2012, aktualisiert 14:50 Uhr, 3284 Aufrufe, 8 Kommentare

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?
Mitglied: miniversum
04.12.2012 um 12:38 Uhr
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
Bitte warten ..
Mitglied: Pireba
04.12.2012 um 13:15 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
04.12.2012 um 13:39 Uhr
moin Pireba,

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

als Einzeiler auf der CMD-line wäre es in etwa so
01.
> 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
Bitte warten ..
Mitglied: Pireba
04.12.2012 um 16:23 Uhr
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.
Bitte warten ..
Mitglied: miniversum
04.12.2012 um 19:36 Uhr
Das wars ja schon fast. Ich hab das ganze nur um eine Stufe erweitert und nicht nach Dateien gesucht:
01.
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"
Bitte warten ..
Mitglied: Pireba
05.12.2012 um 08:01 Uhr
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 =)
Bitte warten ..
Mitglied: miniversum
05.12.2012 um 14:31 Uhr
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:
01.
@echo off 
02.
 
03.
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 ( 
04.
dir /A-D /b "C:\Neuer Ordner\%%a\%%b" >NUL 2>NUL && echo %%b >> "%USERPROFILE%\Desktop\testtesttest.txt" 
05.
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" 
06.
)
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.3: || Bei Fehler (also Dateien nicht vorhaben ...
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
Bitte warten ..
Mitglied: Pireba
06.12.2012 um 23:21 Uhr
Guten Abend miniversum,
vielen vielen Dank. Jetzt klappt es perfekt

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!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Batch: .rar-Pakete automatisch Ordner erstellen und verschieben (2)

Frage von BowserMD zum Thema Batch & Shell ...

Batch & Shell
"Generic" Drucker mit batch - File erstellen (6)

Frage von MrPreesident zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Ordner erstellen und verschieben (6)

Frage von Fromeonly zum Thema Batch & Shell ...

Windows Netzwerk
Netzwerkressource ohne Laufwerksbuchstabe via Batch bzw. Scrip erstellen (13)

Frage von der-suchende zum Thema Windows Netzwerk ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...