none
PowerShell Rename mit Variable aus Dateinamen RRS feed

  • Frage

  • Hallo Liebe Gemeinde,

    ich bin noch recht neu im bereich PowerShell und komme sehr schnell an meine grenzen, meistens Suche ich im Netz und bastel an Beispielen was ich brauche, doch diesmal ist es so Spezifisch das ich nicht so recht weiter komme.

    Ich hab eine Recht große Sammlung an Aufnahmen (OnlineVideorecorder) mit Serien, nun passen die Dateinamen für mich nicht so recht und nenne diese immer um (Zeitweise mit dem Tool JoeRename, was gepasst hatte aber umständlich eingestellt gehört für jeden Job einzeln).

    Ein Beispiel: Dateiname: Castle_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4

    möchte ich umbenennen in Castle_S08-F22_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4 somit ist die Sortierung im Dateisystem für mich Ideal für NAS usw usw. In diesem Fall also brauch ich die Variable "FolgeS08E22" im Dateinamen Zerlegt in 08 und 22 und diese am Anfang gleich nach dem Namen "Castle" wieder eingefügt.

    Natürlich hab ich auch andere Serien die so umgebannt gehören, aber nicht sooo viele als das ich nicht spezifisch für jede Serie ein eigenes Script oder Filter verwenden könnte. Das Zählen von "_" klappt höchstens von hinten, da gezählt von vorne bei Serie und Folgen-Name oft unterschiedlich viele "_" genutz werden.

    Eine andere Gemeinsamkeit hab ich bemerkt ist, das es in den meisten Fällen die Staffel (08) an 26&27 und Folge (22) 23&24 Stelle von hinten aus ab .mp4 zu finden ist. Mit ausnahme wenn etwas mal doppelt runter geladen wurde was dann Castle_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999(1).mp4 heißen würde, auch hier kommt es so selten vor das diese Dateien gerne ausgelassen werden könnten.

    Eine Andere Methode was mir gut gefällt ist das "FolgeS" und die darauf folgenden Ziffern zu erkennen und eben dann diese Zahlen in eine Variable zu Packen und Gezielt an die stelle Nach "Castle" zu setzten.

    Ich würde ja mein bisheriges Script nennen aber die waren alle so untauglich das bei 0 Anfangen vmtl. die bessere idee ist

    PS: Zum Dateinamen der part hinten mit *_99999.mp4 ist meine Kundennummer die ist in wirklich allen aufnahmen enthalten also Statisch, der Teil davor ist das Aufnahme-Datum was ich beibehalten würde aber nicht unbedingt sein muss, es Hilft mir aber ältere und neuere Aufnahmen zu erkennen um Doppelaufnahmen zu Llschen, meist sind die neueren Besser in Qualität als die alten.

    Ich hoffe es ist nicht zuviel verlangt und ich erwarte auch kein Fertiges Script nur den schubs in die Richtige Richtung wie die erkennung der Zahlen am besten gemacht wird.

    Gruß Robert

    Sonntag, 6. Januar 2019 10:32

Antworten

  • Moin,

    die nachhaltigsten Ergebnisse würdest Du sicherlich mit regulären Ausdrücken ("regular expressions" oder RegEx) erreichen. Bin mir aber gerade nicht sicher, ob Dich das Thema nicht überfordert und ob Du das Erlernte später irgendwie nutzbringend einsetzen kannst.

    Ansonsten kannst Du nach "_" splitten, in den einzelnen Teilen nach "Folge*" suchen, "S08E22" nach "S08-F22" umwandeln (indem Du "E" durch "-F" ersetzt) und die Teile in der richtigen Reihenfolge wieder zusammensetzen. Lernt man was über Arrays, das kann nie schaden.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Sonntag, 6. Januar 2019 11:36
  • Um Dir das Prinzip mal zu demonstireren, hab ich mir mal den Spaß gemacht und ein Beispiel gebaut.

    Auf der Seite http://www.regexe.de/ kann man reguläre Ausdrücke testen.

    Du gibst als "Ausgangstext" einfach Deinen Dateinamen an (Castle_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4) - als Regulären Ausdruck kopierst Du einfach mal das hier in das Eingabefeld: "(.*?)_(.*)_Folge(S\d{2}E\d{2})_(\d{4}-\d{2}-\d{2})_.*(\.mp4)"  (ohne Anführungszeichen). Dann aktivierst Du das Kästchen "Ersetzung vornehmen", fügst das hier ein "$1_$3_$2_$4$5" (wieder ohne Anführungszeichen) und klickst auf "los geht's".

    Das Prinzip ist natürlich beliebig erweiterbar ...


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Sonntag, 6. Januar 2019 12:25

Alle Antworten

  • Die Formatierung ist etwas blöd und ich durfte gerade nicht meinen beitrag editieren also hier nochmal Vorher/Nachher was vmtl. am meisten Hilft zu verstehen:

    Vorher:

    Castle_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4

    Nachher:

    Castle_S08-F22_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4

    Sonntag, 6. Januar 2019 10:37
  • hilft jetzt nicht auf deine Frage, aber ich würde empfehlen eine Datenbank aufzubauen. Dann kannst du nach allen möglichen Felder suchen. Wäre schon mit MSACCESS möglich.


    Chris

    Sonntag, 6. Januar 2019 11:35
  • Moin,

    die nachhaltigsten Ergebnisse würdest Du sicherlich mit regulären Ausdrücken ("regular expressions" oder RegEx) erreichen. Bin mir aber gerade nicht sicher, ob Dich das Thema nicht überfordert und ob Du das Erlernte später irgendwie nutzbringend einsetzen kannst.

    Ansonsten kannst Du nach "_" splitten, in den einzelnen Teilen nach "Folge*" suchen, "S08E22" nach "S08-F22" umwandeln (indem Du "E" durch "-F" ersetzt) und die Teile in der richtigen Reihenfolge wieder zusammensetzen. Lernt man was über Arrays, das kann nie schaden.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    Sonntag, 6. Januar 2019 11:36
  • Ich würde Dir (wie Evgenij) auch eher empfehlen, Dich mit Regulären Ausdrücken zu beschäftigen, statt mit Powershell-Scripten, um diese Aufgabe zu lösen. Wenn dieses Joe-Tool Reguläre Ausdrücke unterstützt, wovon ich mal ausgehe, kannst Du Deine Anforderung "relativ" leicht umsetzen. Du solltest damit den Original-Dateinamen in seine Bestandteile zerlegen können und ihn Dir dann wieder ganz nach Belieben zusammenbauen.

    Hier mal ein paar hoffentlich hilfreiche Links:

    Regulärer Ausdruck

    Tutorial Reguläre Ausdrücke

    oder (auch sehr gut und übersichtlich aber auf english) Regular Expressions Info


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''

    Sonntag, 6. Januar 2019 11:44
  • Um Dir das Prinzip mal zu demonstireren, hab ich mir mal den Spaß gemacht und ein Beispiel gebaut.

    Auf der Seite http://www.regexe.de/ kann man reguläre Ausdrücke testen.

    Du gibst als "Ausgangstext" einfach Deinen Dateinamen an (Castle_Auf_Leben_und_Tod_FolgeS08E22_2018-07-19_1315_99999.mp4) - als Regulären Ausdruck kopierst Du einfach mal das hier in das Eingabefeld: "(.*?)_(.*)_Folge(S\d{2}E\d{2})_(\d{4}-\d{2}-\d{2})_.*(\.mp4)"  (ohne Anführungszeichen). Dann aktivierst Du das Kästchen "Ersetzung vornehmen", fügst das hier ein "$1_$3_$2_$4$5" (wieder ohne Anführungszeichen) und klickst auf "los geht's".

    Das Prinzip ist natürlich beliebig erweiterbar ...


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    Sonntag, 6. Januar 2019 12:25
  • wow, cool und danke für all die reaktionen, da hab ich ja mal was zu tun, ich werd mich damit mal beschäftigen :)
    Sonntag, 6. Januar 2019 17:01
  • Also nochmals Danke für die Hilfe !

    und für andere wollte ich nun mein fertiges und Funktionierendes Script freigeben:

    $path = "H:\#Sci-Fi\Stargate - Atlantis\"
    $Serie = "Stargate_Atlantis_"
    
    Get-ChildItem -Filter $serie*.mp4 -path $path | Foreach-Object{   
    
    #                                                             $1        $2       $3      $4                  $5      $6       $7
       $NewName = $_.Name -replace "$Serie(.*)_Folge(S\d{2})E(\d{2})_(\d{4}-\d{2}-\d{2})_(\d{4})_(\d{5}).*(\.mp4)", ("$Serie" + '_$2-F$3__$1_$4_$5_$6$7')
    #    Write-Host $NewName
       Rename-Item -Path $_.FullName -NewName $NewName
       }

    Write-Host(Zeile 8) und Rename-Item(Zeile 9) jeweils vertauschen zum Testen oder Ausführen

    Zeile 6 war als Hilfestellung welcher Regular Expression wo war, ist hier aber leicht verschoben.

    Ich war noch nicht mutig genug dazu durch Regular Expression die Serie erkennen zu lassen, da aber hier das Muster doch unterschiedlich ist hab ich das eben vorgegeben, habe das aber wenigstens durch eine einzige Eingabe reduziert ;)

    Ich nutze save.tv als Online Videorecorder, wer das also auch hat kann dieses Muster 1:1 nutzen

    $Serie definiert den Seriennamen als Filter, als Dateiname vorher und nachher

    $1 ist also der Serien Titel

    $2 ist die Staffel

    $3 ist die Folge/Episode

    $4 ist Aufnahme-Datum

    $5 ist Aufnahme-Zeit

    $6 ist Kundennummer

    $7 ist die Dateiendung



    • Bearbeitet Robert_1 Sonntag, 17. Februar 2019 13:05
    Sonntag, 17. Februar 2019 13:03
  • Cool. Danke für's Teilen und schön, dass Dir unsere Tipps geholfen haben.
    Hier noch weitere Tipps ... ;-)

    Write-Host(Zeile 8) und Rename-Item(Zeile 9) jeweils vertauschen zum Testen oder Ausführen

    Hier könntest Du den common Parameter -WhatIf benutzen. Bei potenziell gefährlichen Actionen zeigt er Dir an, was passieren würde, ohne die eigentlich Aktion durchzuführen. Im fertigen Script kannst Du den dann einfach mit einem '#' auskommentieren. Dann brauchst Du nich das böse Write-Host zu benutzen. ;-)

    Zeile 6 war als Hilfestellung welcher Regular Expression wo war, ist hier aber leicht verschoben.

    Hier muss man ein bissl tricksen. Wenn Du Dir die HTML-Ansicht Deines Posts anzeigen lässt, kannst Du in den HTML-Tag für den Code einfach das Attribut 'style="font-family:monospace;"' hinzufügen (ohne die einfachen Anführungszeichen)- dann sieht's fast so aus, wie in einem richtigen Code-Editor.


    Live long and prosper!

    (79,108,97,102|%{[char]$_})-join''


    • Bearbeitet BOfH-666 Sonntag, 17. Februar 2019 15:59
    Sonntag, 17. Februar 2019 15:58