2015-08-31 18 views
12

Ich versuche, die Rename-Item-Cmdlets zu verwenden, um den nächsten zu tun:Rename-Item und außer Kraft setzen, auch wenn vorhanden

i-Ordner habe, die "* .txt" Dateien (sagen läßt, 1.txt , 2.txt etc ...) Ich möchte Dateien mit einem Präfix kopieren, sie in * .txt umbenennen und vorhandene Dateien überschreiben, falls solche vorhanden sind.

Beispiel:

Ordner c: \ TEST Dateien: 1.txt, 2.txt, 3.txt, 4.txt, 5.txt, index.1.txt, index.2.txt, index.3.txt, index.4.txt, index.5.txt

ich verwenden möchte umbenennen-Artikel jeder index.*.txt filtern und benennen sie diese in *.txt, und wenn eine Datei vorhanden, ersetzen sie ihn .

Danke Jungs

+2

Haben Sie den -force Schalter versucht? –

+0

@PeterSchneider Force wird auf diese Weise nicht mit 'Rename-Item' arbeiten, da Sie immer noch' Datei kann nicht erstellen können, wenn diese Datei bereits existiert. ' – Matt

+0

Sie könnten [System.IO.File] :: Copy ($ sourcefile, $ Zieldatei, $ Wahr); - Das $ true überschreibt die vorhandene Datei ... –

Antwort

15

Wie von @lytledw, Move-Item -Force funktioniert hervorragend zum Umbenennen und Überschreiben von Dateien.

Um den index. Teil des Namens zu ersetzen, können Sie die -replace Regex-Operator verwenden:

Get-ChildItem index.*.txt |ForEach-Object { 
    $NewName = $_.Name -replace "^(index\.)(.*)",'$2' 
    $Destination = Join-Path -Path $_.Directory.FullName -ChildPath $NewName 
    Move-Item -Path $_.FullName -Destination $Destination -Force 
} 
+0

Mit leichten Modifikationen hat der "Move-Item" den Trick geschafft! Prost ! –

+0

Ich wollte Tausende von doppelten Dateien umbenennen, die aus der Migration meiner Musikbibliothek von mehreren Backup-Speicherorten auf einen neuen PC resultieren, von denen einer den Dateinamen automatisch einen Datumsstempel hinzufügte. Ich habe diese Antwort mit einigen Modifikationen verwendet, nämlich: 'C: \ Benutzer \ Reyje \ Musik \ iTunes \ Medien \ Musik> Get-ChildItem" * (2017_12_14 *. * "-Recurse | ForEach-Objekt { >> $ NewName = $ _. Name -replace "\ (2017_12_14 17_50_59 UTC \)", " >> $ Ziel = Join-Path -Path $ _. Directory.FullName -ChildPath $ NewName >> Verschieben-Item -Path $ _.FullName -Destination $ Destination -Force >>} ' – PatentWookiee

+0

Die Idee war, die literale Zeichenfolge" (2017_12_14 17_50_59 UTC) "durch nichts zu ersetzen - die '' sind zwei einfache Anführungszeichen mit nichts zwischen ihnen. Dies funktionierte für die große Mehrheit der Dateien, aber für jede Datei mit eckigen Klammern in seinem Namen oder Pfad, habe ich Fehler wie folgt: Move-Item: Kann die dynamischen Parameter für das Cmdlet nicht abrufen.Das angegebene Platzhalterzeichenmuster ist nicht gültig: 09 09 Old Purple Tin [9% der reinen Hea (2017_12_14 17_50_59 UTC) .m4a In Zeile: 4 Zeichen: 7. + Move-Item -Path $ _ Fullname -Destination $ Destination -Force + – PatentWookiee

3

habe ich versucht, die Rename-Item -force und es hat nicht funktioniert. Allerdings konnte ich move-item -force tun und es funktionierte gut

+0

Der Op fragt mehr als eine Frage, aber das ist die Lösung für den ersten ein. – Matt

Verwandte Themen