Skript: NAME einer Textdatei in eine XML-Datei im gleichen HDD-Ordner eintragen?


rloxley

Grünschnabel
Hallo Leute!

Ich möchte gerne ein Skript / eine batch-Datei wie im Titel beschrieben erstellen. Das Szenario: Ich habe sehr viele Ordner und Unterordner auf diversen Festplatten (nicht nur C:/") , in denen u.a. JEWEILS eine NFO-Datei (mit XML-Inhalt) und zukünftig eine Textdatei liegen. Das benötigte Skript soll dann "einfach" automatisch die NAMEN der Textdateien auslesen und an gewünschter Stelle in die NFO-Datei im gleichen Ordner eintragen. In meinem Fall handelt es sich um Film-Informationen, die in der NFO-Datei eingetragen werden und später von einem Mediacenter ausgelesen werden.

Eine XML-Datei ist ja nach folgendem Beispiel-Schema aufgebaut:
<title></title>
<rating></rating>
<year></year>
<genre></genre>
<country></country>

Um diese Informationen nach und nach einzutragen, würde ich gerne so vorgehen, dass ich jeden Film in allen Unterordnern kurz starte und nur nach EINER dieser Informationen suche, z.B. Country = Deutschland, USA, GB, usw... Das Ergebnis würde ich dann jeweils als eine Textdatei in jedem diesem Ordner speichern, also z.B. "Deutschland.txt" oder "USA.txt". Wenn ich damit fertig bin, liegt dann also in jedem Unterordner NUR jeweils EINE Textdatei mit Namen des Landes. Dann möchte ich das Skript starten und es soll eben z.B. dieses "Deutschland", "USA" usw. in allen Ordnern in die jeweilige XML-Datei im gleichen Ordner bei "<country></country>" eintragen, sodass ich die Eingaben nicht alle einzeln von Hand machen muss.

Ich hoffe, das konnte man soweit nachvollziehen :)

So ein einmaliges Skript könnte ich dann ja leicht für alle gewünschten XML-Einträge anpassen, also dann auch für genre, year usw., sodass ich für alle gewünschten Einträge auch Skripte habe, die ich nacheinander abarbeiten kann.

Ich habe leider keine (oder nur SEHR eingeschränkte) Skript-Erfahrungen... Hat da jemand eine Lösung für mich, wie ich das am Besten anstelle? Oder sogar einen einfacheren/besseren Lösungsvorschlag? Zur Info: Es handelt sich um Filme (Dokus), die eben leider nicht automatisch mit den gängigen Programmen aus den web-Datenbanken geholt und erstellt werden können, da sie da nicht zu finden sind.

Ich danke Euch schon mal für das Interesse, eure Zeit und jeden Lösungsvorschlag :)

Viele Grüße.
 

rloxley

Grünschnabel
Dankeschön für Deine Antwort un den Tipp.

Ich befürchte, das ist mir weitaus zu abstrakt, um es für mein Problem adaptieren zu können...
 

ComFreek

Mod | @comfreek
Moderator
Ich verstehe nicht ganz, woher die Informationen wie das Land kommen sollen? Soll das Skript dich das manuell fragen?
 

rloxley

Grünschnabel
Nein, so wie beschrieben: Ich sehe mir jede Doku kurz an, stelle fest, aus welchem Land sie stammt, und schreibe den Namen des Landes als Titel in eine neue Textdatei im gleichen Ordner. Ich erstelle selber manuell eine "USA.txt", z.B. Der Name soll dann, wenn ich fertig bin, jeweils ausgelesen werden und in den entsprechenden tag in die *.nfo (xml) im gleichen Ordner eingetragen werden.
 

ComFreek

Mod | @comfreek
Moderator
Ah, wieso schreibst den Namen des Landes nicht einfach in eine Datei mit einheitlichem Namen? Zum Beispiel legst du immer eine Datei "Land.txt" an und bei Doku #1 hätte die den Inhalt "USA" und bei Doku #2 den Inhalt "Österreich".

Noch einfacher: leg eine Exceltabelle an mit Zeilen für die Dokus und Spalten Herkunftsland, Genre usw. Danach kann das Skript (nimm PowerShell) das sehr komfortabel auslesen und in die XML-Dateien eintragen.
 

rloxley

Grünschnabel
Was ist denn der Vorteil bei der Vorgehensweise? Meine Vorstellung: Rechtklick im Ordner, neues Textdokument, "USA", fertig. Wenn alle fertig sind, Skript laufen lassen. Finde ich schneller und unkomplizierter.

Mit Excel arbeite ich gar nicht... Die Idee klingt nicht so schlecht, aber da MUSS ich wohl SÄMTLICHE Informationen erst einmal zusammen haben, bevor man das Skript laufen lässt. So, wie ich es vorhabe, können die Länder schon eingetragen werden, wenn ich die Kategorien, Laufzeit, usw. noch gar nicht ermittelt habe.. gefällt mir besser.
 

ComFreek

Mod | @comfreek
Moderator
Was ist denn der Vorteil bei der Vorgehensweise? Meine Vorstellung: Rechtklick im Ordner, neues Textdokument, "USA", fertig. Wenn alle fertig sind, Skript laufen lassen. Finde ich schneller und unkomplizierter.

Woher soll das Skript wissen, wo der Ländername steht? Was, wenn du später dann zwei Dateien hast: USA.txt, Horror.txt. Woher soll das Skript wissen, dass Ersteres das Land ist und Zweiteres das Genre? Das würde die Komplexität des Skripts maßgeblich steigern, weil du Listen mit allen Länder- und Genrenamen vorhalten müsstest.

Die Idee klingt nicht so schlecht, aber da MUSS ich wohl SÄMTLICHE Informationen erst einmal zusammen haben, bevor man das Skript laufen lässt.
Nein, du könntest bei noch fehlender Information die Zelle einfach leer lassen. Das Skript würde dann diese leere Information nicht eintragen.
 

rloxley

Grünschnabel
Indem man es ihm sagt? Schreibt man Skripts nicht immer so? Ich HABE später keine zwei Dateien, weil ich jeweils nur schnell nach EINER Rubrik durchschauen möchte, also z.B. NUR Länder. Ich brauche und möchte gar keine "all-in-one"-Lösung für alle Infos auf einmal. Mir reicht ein kleines Skript, das ich dann selbst kurz abwandeln kann, je nach dem, in welchem tag die Info eingetragen werden soll (Land, Laufzeit, Kategorie, etc.). Dann lasse ich das Länder-Skript laufen. Danach sehe ich vielleicht NUR schnell das Genre durch und lasse dann das Genre-Skript laufen. SO möchte ICH es machen. Einen Vorteil sehe ich in Deinen sicher gut gemeinten "Mach das mal anders"-Vorschlägen für mich und meine gewünschte Arbeitsweise nicht. Ich verstehe auch nicht, was Dein Grund ist, mich unbedingt von dem abzubringen... WO ein Skript die Info ausliest, ob im Namen einer Textdatei oder IN der Textdatei, ist doch egal. Korrigiert mich bitte, wenn das falsch ist.

Warum ich das auf keinen Fall so machen soll, wie ICH arbeiten möchte, erschliesst sich mir nicht.
 

Sempervivum

Erfahrenes Mitglied
Eines verstehe ich noch nicht: Du musst ja wissen, zu welchem Film diese Textdatei gehört, jedenfalls dann, wenn mehrere oder viele Filme in dem Ordner sind. Oder hat jeder Film einen Ordner für sich?
 

rloxley

Grünschnabel
Dies ist z.B. ein powershell-Skript, mit dem ich die TITEL der Unterordner auslesen lassen kann, in denen die Dokus jeweils liegen und in den "title-tag" der *.nfo in den jeweiligen Unterordnern schreiben lassen kann. Die Unterordner haben IMMER den gleichen Titel wie die Doku IM Unterordner:

@Echo off
set "ordner=C:\000"
powershell -ExecutionPolicy ByPass -NoProfile -Command "gci "%ordner%" -Filter *.nfo -Recurse -Force | %%{(gc $_.Fullname) -replace '(?<=<title>).*?(?=</title>)',$_.Directory.Name | sc $_.Fullname -Force -Verbose -Encoding UTF8}"

Vielleicht könnte man das wie von mir gewünscht abändern? Also WAS ausgelesen werden soll (= der Titel der von mir zu erstellenden *.txt-Dateien in den Unterordnern und in welchem tag es eingetragen werden soll. (Land = USA.txt = <country>USA</country>. Dann könnte ich den Ziel-tag für jede gewünschte Rubrik einfach nach Belieben abändern.
 
Zuletzt bearbeitet:

rloxley

Grünschnabel
Ja, jede Doku liegt in einem Unterordner mit gleichem Namen wie die Doku selbst. In diesen Unterordnern liegen dann die Doku, die *.nfo, eine fanart.jpg und eine poster.jpg, alle mit exakt den gleichen Namen.
 

rloxley

Grünschnabel
HDD C:\
- Ordner "Dokus"
- Unterordner für jede einzelne Doku
- IN den Unterordnern, z.B. Unterordner "Doku1":
- Doku1.avi
- Doku1.nfo (xml)
- Doku1-poster.jpg
- Doku1-fanart.jpg

... UND die von mir dann jeweils kurz erstellte "USA.txt", oder "Thriller.txt", usw... die ich nach jedem Skriptdurchlauf dann natürlich wieder lösche, bevor ich mir die nächste Kategorie vornehme.

Der Aufbau ist GRUNDSÄTZLICH gleich. Nur der Speicherort (C:\, D:\ E:\, ... Z:\) ändert sich.
Auch die Basis-nfo-Datei ist immer die Gleiche, die mit den Infos zu füllen ist.

Ich möchte halt gerne jeden Unterordner kurz nach EINER Info (z.B. Land) durchsehen und wenn ich fertig bin, das Skript für ALLE Unterordner durchlaufen lassen können. Dann ist überall das Land eingetragen, ich kann die *txt-Dateien wirder löschen und beim nächsten mal alle Kategorien durchsehen, oder die Laufzeit, oder oder...
 
Zuletzt bearbeitet:

Technipion

Erfahrenes Mitglied
SO möchte ICH es machen. Einen Vorteil sehe ich in Deinen sicher gut gemeinten "Mach das mal anders"-Vorschlägen für mich und meine gewünschte Arbeitsweise nicht. Ich verstehe auch nicht, was Dein Grund ist, mich unbedingt von dem abzubringen...
Warum ich das auf keinen Fall so machen soll, wie ICH arbeiten möchte, erschliesst sich mir nicht.
Das Schlüsselwort hier lautet Erfahrung. Dein System ist heftig ineffizient und so ziemlich das Gegenteil von robust. Wenn sich z.B. an deinem Ordneraufbau, deinem Namensschema oder dem Aufbau der xml-Datei etwas ändert, guckst du in die Röhre. Womöglich zerschießt dir das Skript dann sogar die ganze Datenbank.

Ich sehe mir jede Doku kurz an, stelle fest, aus welchem Land sie stammt, und schreibe den Namen des Landes als Titel in eine neue Textdatei im gleichen Ordner.
Da du sowieso alles manuell machen musst: Wieso trägst du die Sachen nicht gleich selbst in die xml-Datei ein? :unsure:

Für die Verwaltung von Daten bietet es sich übrigens immer an, sämtliche Infos an einem zentralen Ort zu lagern, statt sie über dutzende Ordner zu verstreuen. Ein Tabellenkalkulationsprogramm bietet sich hier tatsächlich an. Und dort ließen sich auch einzelne Eigenschaften Stück für Stück eintragen.

Gruß Technipion
 

Sempervivum

Erfahrenes Mitglied
Ich habe mal dieses Powershell-Skript geschrieben:
Code:
$tagName = "country"
# Rekursiv alle Dateien mit der Endung .nfo ermitteln
$files = Get-ChildItem -Filter *.nfo -File -Recurse
ForEach ($file in $files) {
    # Verzeichnis extrahieren
    $folder = Split-Path -Path $file.FullName -Parent
    # Pruefen ob eine txt-Datei existiert
    $txtFile = Get-ChildItem -Path $folder -Filter *.txt -File
    if ($txtFile.Count -eq 1) {
        # Name der Datei ohne Endung ermitteln
        $name = $txtFile.BaseName
        # Inhalt der nfo-Datei lesen
        $xml = Get-Content -Path $file.FullName
        # Inhalt in Tag eintragen
        $xml = $xml -Replace "<$tagName>.*</$tagName>", "<$tagName>$name</$tagName>"
        Write-Host "Tag" $tagName "in" $file.FullName "auf" $name "gesetzt"
        # Geaendertes XML wieder in nfo-Datei eintragen
        Set-Content -Path $file.FullName -Value $xml
    }
    else {
        Write-Host "Keine txt-Datei in" $folder "gefunden"
    }
}
Read-Host -Prompt "Press Enter to exit"
Als z. B. edit-nfo.ps1 im Wurzelverzeichnis ablegen und mit Rechtsklick - "Mit Powershell ausführen" starten.
Unbedingt vorher eine Sicherunskopie anlegen, falls etwas nicht wie gewünscht funktioniert!
Setzt voraus, dass das Tag schon in der nfo-Datei existiert. Wenn das nicht der Fall ist, kann man es leicht erweitern, so dass es ggf. eingefügt wird.

Verbesserungsvorschlag von mir: Tagnamen in den Dateinamen der txt-Datei übernehmen, dann kannst du gleich mehrere Tags erfassen:
country-USA.txt
genre-Folk.txt
userrating-5.txt
Allerdings müsste man dazu das Skript ein wenig erweitern.
 

rloxley

Grünschnabel
Erst einmal vielen herzlichen Dank an Euch alle :)

Zum vielleicht besseren Verständnis: Ich lege hiermit keine Datenbank an, sondern mache nur die "Vorarbeit" dafür, fülle nfo/xml-Dateien mit Informationen, die anschliessend automatisch vom Programm (Kodi) ausgelesen und in dessen Datenbank eingetragen werden.

ALLES, was ich hier mache, ist "nur" temporär und einmalig, bis die xml-Dateien mit den entsprechenden Info's gefüllt sind. Es geht hier also "nur" um die Art und Weise, wie ich die jeweiligen Informationen schnell und effektiv in die entsprechenden tags der xml-Dateien bekomme. NUR DIESE werden später vom Programm genutzt, ALLES andere für diese "Vorarbeit" wird in den Ordnern anschliessend wieder gelöscht.

Meine Vorstellung war, dass ein Skript mir eine "Massenverarbeitung" ermöglicht, bei der ich nicht jede einzelne nfo/xml-Datei in jedem Unterordner von Hand öffnen muss, im notepad++, das ich dafür nutze, immer wieder erst Kodierung (Stichwort Umlaute) und Skriptspache einstellen muss, um die Info dann von Hand eintragen zu müssen...

Es lässt sich sicher darüber "streiten", WIE man das jetzt am Besten angeht und ich als Unerfahrenster unter uns höre mir natürlich gerne jeden Verbesserungsvorschlag an. Zumal ich Euch ja um Hilfe bitte. :)

FÜR MICH war die Vorstellung: "Schneller Rechtsklick im Unterordner, neue Textdatei, 'USA.txt', weiter" halt am einfachsten. Bei einer MÖGLICHEN zu erstellenden Excel-Tabelle sehe ich deutlich mehr "Arbeit" - und AUCH keinen Vorteil zu "dann trag's doch gleich von Hand in die XML-Datei ein"... korrigiert mich bitte, wenn ich falsch liege. Zumal ich mich mit Excel gar nicht auskenne, wie ich oben schon schrieb.

Man kann ein Skipt (falls machbar) doch auf alle erdenklichen EIGENEN Wünschen zuschneiden. Salopp aber nicht respektlos gesagt,: Egal, wie andere Profis das finden. DAS war meine Bitte.

"Ihr" mögt meine Idee plump finden, ich halte Eure Vorschläge für MEIN Anliegen spontan für weit übers Ziel hinaus, gar nicht notwendig und deutlich arbeitsaufwändiger. Auch hier: Korrigiert mich bitte, wenn ich falsch liege.

@Sempervivum zeigt doch erstklassig, dass es möglich ist. Er hinterfragt mit keiner Silbe mein Vorhaben, sondern nur: "Was willste machen? SO könnte das gehen..."-> Besser geht's nun wirklich nicht :) DAZU sogar noch ein echter Verbesserungsvorschlag, der mir RICHTIG GUT gefällt und den ich sehr gerne übernehmen würde/möchte! Ein herzliches Dankeschön an Dich dafür :) Wenn das AUCH NOCH ginge, wäre ich NOCH glücklicher als ich mir vorher vorstellte... :)

Ich werde Dein Skript jetzt mal ausprobieren und dann berichten :)

Nochmals dankeschön an Euch ALLE: und ganz besonders an @Sempervivum :)

Viele Grüße