steve2388
Goto Top

Powershell - Wildcards im Stringvergleich

Hallo zusammen,

ich finde leider mit Hilfe der Foren-/Googlesuche leider nichts, was mir weiterhilft.

Ich möchte gerne in einem Verzeichnis Dateien mit gleichen Namen auf wirkliche Gleichheit prüfen. Leider sind in dem Verzeichnis doppelte Dateien im Schema "Name - 1.mp3". habe nun versucht mir eine Schleife zu bauen die in etwa wie folgt aussieht:
if ($files[$f].FullName.EndsWith(" - *.mp3"))  
        {
            $file1 = $files[$f].FullName.Replace(" - *.mp3",".mp3")  
        }

Leider scheint der * nicht wirklich als Wildcard zu funktionieren, da ein manueller Test ein $False bringt. Da die Zahlen auch zweistellig sein können hatte ich gehofft mit dem * sowohl einstellige als auch zweistellige Zahlen zu "erwischen".

Jemand eine Idee?

Dank und Gruß

Content-ID: 647015

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

NordicMike
NordicMike 01.02.2021 um 08:39:55 Uhr
Goto Top
Du musst das Inhaltsverzeichnis auslesen und als Liste behandeln, das kommt ohne Wildcards aus. Dann ein Replace mit "for each".
Steve2388
Steve2388 01.02.2021 um 08:51:40 Uhr
Goto Top
Danke für die Antwort. Ich lasse den Inhalt des Verzeichnisses ja schon in $files schreiben. Mir ist aber jetzt nicht wirklich klar, wie ich ohne Wildcards den Replace machen soll, da ich ja " - *.mp3" mit ".mp3" ersetzen will. Und der * eine beliebige Zahl sein kann.
NordicMike
NordicMike 01.02.2021 um 09:13:59 Uhr
Goto Top
Mit einem "for each" hast du dann jeden Dateienamen in einer einzelnen Variable. Also brauchst du keine Wildcards mehr.

Du replacest es in der Variable selbst

$file1 -replace " - ", " "

und renamest danach die Datei als nächsten Befehl.

Oder, was ich gerade ergoogelt habe:

Get-ChildItem .. | Rename-Item -NewName { $_.Name.Replace(" - ", "") }
Steve2388
Steve2388 01.02.2021 um 09:26:59 Uhr
Goto Top
ja, das habe ich schon verstanden nur hilft mir das nicht.
Ich habe in einem Verzeichnis ja beispielsweise folgende Dateien:
Lied.mp3
Lied - 1.mp3
Lied - 2.mp3
...
Lied - 11.mp3
etc.

Wenn ich also deinen Befehl benutzen würde ergäbe das:
Lied.mp3
Lied1.mp3
Lied2.mp3
...
Lied11.mp3
Ich möchte aber auch die Zahlen aus dem Dateinamen entfernen um in einem weiteren Vergleich andere Attribute zu vergleichen wenn die Namen gleich sind.
NordicMike
NordicMike 01.02.2021 aktualisiert um 09:36:33 Uhr
Goto Top
Solange dann nicht gleiche Namen im gleichen Ordner sind...
Da musst du aufpassen, weil viele Dateinamen haben das Minus als Trenner zwischen Interpret und Titel. Du müsstest also die Variable vorher noch prüfen wie lang der Rest hinter dem " - " ist und/oder eine Zahl ist - z.B. mit Regex.

Kleiner Tip:
Verwende Mediamonkey, es sucht dir alle Tracks heraus, die den gleichen Fingerprint besitzen (so kann man auch Single Versionen, Maxis und Remixe unterscheiden).
147323
147323 01.02.2021 aktualisiert um 11:08:52 Uhr
Goto Top
Dafür gibt es Group-Object um Dateien mit ähnlichen Dateinamen zu gruppieren ...
ls 'D:\Ordner' -File -Filter *.mp3 | group {$_.Basename -replace ' - \d+$'}  
Ergebnis sind Objekte mit den Eigenschaften Count,Name,Group. In Count steht die Anzahl der Files mit dem "Namen", und in der Eigenschaft Group sind die Files enthalten die nach entfernen des Regex Pattern (" - \d+$") im Basename der Files gleich sind. über die Group kannst du dann mit nem Foreach itterieren ...

Gruß j.