Benutzer mit den meisten Antworten
Dateien und Ordner umbennen

Frage
-
Hallo,
ich hänge an einem Problem fest, irgend wie brauche ich ein paar Anregungen. Ich habe eine weit verzweigte Datei- und Ordnerstruktur, deren Datei, bzw. Ordnernamen ungefähr diese Form haben (meistens) AAAAAAA((BBBBBB))CCCCCCC.DDD, eventuell auch mal AAAA((BBBBB))CCCC((DDD)).EEE. Nun versuche ich ein Script zu schreiben, das diese Struktur abgrast und alle Datein, bzw. Ordner die ((BBB)) beinhalten um genau diesen Teil umbenennt, heisst alles was zwischen den Klammern steht, so vorhanden, incl. Klammern löscht. Bei Dateien und Ordnern. Die Namen sind von der länge untschiedlich.
Hat jemand einen Gedankenanstoß für michi?
Danke!
Antworten
-
Aha, so denke ich mal:
$pfad = 'H:\' Get-ChildItem $pfad -Recurse | ForEach-Object { if( $_.FullName -match "\(\((.*)\)\)") { echo "jap" $newName = $_.FullName -replace"\(\((.*)\)\)" Rename-Item $_.FullName $newName } }
Irgendwie sind reguläre Ausdrücke komisch mit der PowerShell:) Also eigentlich nur die Methode Contains. Die reagiert anders als match.
Egal, viel Spass und Gruss
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 8. März 2011 12:15
-
Um falsche Matches zu verhindern, kannst du die Mustererkennung mit ".name" (nur Datei bzw. Ordnername) verbinden, statt mit ."fullname" (voller Pfadname).
Ausserdem musst du verhindern, das versucht wird, ein Objekt in einem bereits umbenannten Pfad umzubenennen, da der Pfadname sich ja mittlerweile geändert hat und so der Befehl fehlschlägt.
So sollte es gehen:
function FNrename ($folder) { $items = dir $folder foreach ($obj in $items) { if( $obj.Name -match "\(\((.*)\)\)" ) { $newName = $obj.Name -replace"\(\((.*)\)\)" Rename-Item $obj.fullname $newName } } $items = dir $folder foreach ($obj in $items) { if ($obj.PSiscontainer) { FNrename $obj.fullname } } } FNrename "j:\tmp"
Das Funktion liest jeweils nur einen Ordner ein und benennt alle passenden Objekte um. Dann liest sie den Ordner erneut mit den neuen Namen ein, und führt die Funktion in allen vorhandenen Unterverzeichnissen aus...
Grüße, Denniver
http://bytecookie.wordpress.com/- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 8. März 2011 12:15
Alle Antworten
-
Ich hoffe, das ist das was du suchst:
$pfad = 'H:\' Get-ChildItem $pfad -Recurse | ForEach-Object { if( $_.FullName.Contains("((BBB))")) { $newName = $_.FullName.Replace("((BBB))", "") Rename-Item $_.FullName $newName } }
Bitte noch testen, habe es nur ganz kurz laufen lassen:)
Gruss
Raphi
-
Aha, so denke ich mal:
$pfad = 'H:\' Get-ChildItem $pfad -Recurse | ForEach-Object { if( $_.FullName -match "\(\((.*)\)\)") { echo "jap" $newName = $_.FullName -replace"\(\((.*)\)\)" Rename-Item $_.FullName $newName } }
Irgendwie sind reguläre Ausdrücke komisch mit der PowerShell:) Also eigentlich nur die Methode Contains. Die reagiert anders als match.
Egal, viel Spass und Gruss
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 8. März 2011 12:15
-
ja, so
Das funktioniert, aber nicht wirklich, leider. Genau an der Stelle bin ich auch schon hängen geblieben. Warum? Ich schmeiss mal die Fehlermeldung rein:E:\export\User-37\(05) W01 - W01G, General Business((Collection-34))\W0101_General((Collection-4794))\C_Competition((Collection-4796))\C06_f((Colle
ction-4812))
E:\export\User-37\(05) W01 - W01G, General BusinessRename-Item : Cannot rename because the target specified represents a path or device name.
At C:\Documents and Settings\Rob\Desktop\filenamecleaner.ps1:10 char:18Obere Zeile ist der Eingangsname, untere der Ausgangsname. Offensichtlich holt er sich den kompletten Pfad, stolpert über die ersten Doppelklammern und will umbenennen. Korrekt wäre es wenn er in die unterste ebene wandert, erst die dateien und dann, wenn fertig die Ordner umbenennt.Wie gesagt, genau an der Stelle hing ich gestern fest... :( -
Um falsche Matches zu verhindern, kannst du die Mustererkennung mit ".name" (nur Datei bzw. Ordnername) verbinden, statt mit ."fullname" (voller Pfadname).
Ausserdem musst du verhindern, das versucht wird, ein Objekt in einem bereits umbenannten Pfad umzubenennen, da der Pfadname sich ja mittlerweile geändert hat und so der Befehl fehlschlägt.
So sollte es gehen:
function FNrename ($folder) { $items = dir $folder foreach ($obj in $items) { if( $obj.Name -match "\(\((.*)\)\)" ) { $newName = $obj.Name -replace"\(\((.*)\)\)" Rename-Item $obj.fullname $newName } } $items = dir $folder foreach ($obj in $items) { if ($obj.PSiscontainer) { FNrename $obj.fullname } } } FNrename "j:\tmp"
Das Funktion liest jeweils nur einen Ordner ein und benennt alle passenden Objekte um. Dann liest sie den Ordner erneut mit den neuen Namen ein, und führt die Funktion in allen vorhandenen Unterverzeichnissen aus...
Grüße, Denniver
http://bytecookie.wordpress.com/- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 8. März 2011 12:15