an34mem
Goto Top

PowerShell + RegEX - Unerlaubte Zeichen und Symbole aus Dateinamen entfernen

Ich bitte um eine Hilfestellung mit PowerShell + RegEX.

Ich möchte alle unerlaubten Zeichen aus Dateinamen entfernen - insbesondere Symbole!
Fragt bitte nicht wieso die da drin sind - Einfach zum: "Kopfschütteln".

Zulassen möchte ich nur "A-Z, a-z, 0-9 + -_()", sowie Umlaute.
Ok. Es gibt sehr viele Themen bereits darüber, aber ob Ihr es glaubt oder nicht, ich verbringe
bereits Stunden damit ohne eine entsprechende Lösung zu finden.

Beispiel:
Rename-Item "Test_Symbol_in_😍_Datein😯ame.txt" -NewName "Neuer_Dateiname.txt"
(UTF-8-BOM)

Rename-Item "Test_Symbol_in_??_Dateiname.txt" -NewName "Neuer_Dateiname.txt"
(Ansi)

Kopiere ich z.B. aus einer TXT mit UTF-8-BOM den Befehl, erscheint im cmd Fenster Ansi.
Zwar funktioniert das, aber ich möchte das mit RegEX (u. mögl. als Batch / Alle Dateinamen im Verzeichnis) tätigen,
insbesondere wenn zig Dateien umbenannt werden müssen.

Wie ist es daher möglich den Dateiname umbenennen zu lassen, oder besser gesagt "alle unerlaubten Zeichen"
werden einfach zu einem _ Unterstrich geändert.

Umlaute, und Leerzeichen sollten jedoch im Dateiname vorhanden bleiben - in etwa so was:
^\\w\\däüö Ä_ÜÖ()\\+\\-.

Nach X Versuche mit RegEx bekomme ich aber nur ständige Syntax Fehlermeldungen.
Daher möchte ich nun in die Runde fragen, und hoffe sehr, dass vielleicht jemand ein Lösungsvorschlag hat.

Vielen Dank!

Content-Key: 639712

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

Printed on: April 25, 2024 at 00:04 o'clock

Mitglied: 147069
Solution 147069 Jan 12, 2021 updated at 17:08:22 (UTC)
Goto Top
Zulassen möchte ich nur "A-Z, a-z, 0-9 + -_()", sowie Umlaute.
function Replace-Chars([parameter(ValueFromPipeline=$true)]$string,$replaceString='_'){  
    $r = "[^\w\+\-\(\)äöü ]"  
    if ($replaceString -match $r){
        Write-Error -Message "Parameter '-replaceString' contains invalid filename chars/sequences." -Category InvalidArgument -TargetObject $replaceString  
        break
    }
    while($string -match $r){
        $string = ($string -replace $r,$replaceString).trim()
    }
    return $string
}

ls 'D:\Ordner' -File -Recurse -Force -EA SilentlyContinue | ?{$_.Basename -match '[^\w\+\-\(\)äöü ]'} | ren -NewName {(Replace-Chars $_.Basename -replaceString '_') + $_.Extension} -Force -Verbose  
In letzter Zeile Beispiel für Anwendung auf ne Ordnerstruktur.
Member: AN34Mem
AN34Mem Jan 12, 2021 updated at 17:46:36 (UTC)
Goto Top
Unglaublich bluewonder!

Ich habe seit Beginn deine einzelne Schritte nachverfolgt und getestet.
Erst hat es bei mir nicht funktioniert, und Schritt für Schritt kam eine neue Lösung von Dir.
Jetzt funktioniert es.

Wahnsinn tolle Arbeit, und eine super TOP Hilfestellung! Begeisterung pur.
Ich wünsch Dir ganz ganz viel Glück und Gesundheit!

DICKES DANKE!

Gruß auch an alle Mitleser
Super Forum!