Batch-Umbenennung von Dateien durch Berechnen eines Werts und Verwenden des neuen Namens

550
L Wright

Ich habe ein paar hundert JPGs, die umbenannt werden müssen. Ich brauche die folgende einfache Gleichung, die auf die vorhandene Nummer in jedem Dateinamen angewendet wird:

(x-290) * -1

"Vitrine Hinge.0.jpg" würde zu "Vitrine Hinge.290.jpg" werden, "Vitrine Hinge.1.jpg" würde zu "Vitrine Hinge.289.jpg" werden und so weiter.

Einige der fraglichen Dateien

Ich habe folgendes verwendet:

Dir * .jpg | `foreach {$ data = $ _. name.Split (". ") Rename-Item -NewName {'(' + $ data 1 + '-290) (- 1)'}}

Und ich erhalte Fehler.

0
Stapelumbenennen von Dateien ist eine häufige Frage in SU. Haben Sie nach vorherigen Lösungen gesucht? Arbeiten Sie mit Code und haben ein bestimmtes Problem? root vor 6 Jahren 0
@ root habe ich recherchiert. L Wright vor 6 Jahren 0
Ich habe dies als einfache Batch-Umbenennung verwendet: Dir * .jpg | ForEach-Object -begin {$ count = -146} -process . Es berücksichtigt jedoch nicht die Reihenfolge der Dateien und ordnet die Reihenfolge neu an. L Wright vor 6 Jahren 0
Wenn die Ganzzahl immer hinter dem ersten `.` steht, können Sie Folgendes verwenden:` gci. * .jpg | % {$ int = $ _. Name.Split (".") [1]; $ number = ($ int - 290) * -1; rni $ _. FullName -NewName ($ _ -replace $ int, $ number)} ` SimonS vor 6 Jahren 0
Anstelle von `` (x-290) * - 1` `sagen Sie einfach` `290-x``. G-Man vor 6 Jahren 0

2 Antworten auf die Frage

2
Ricc Babbitt

Ryans Antwort ist nett, weil sie ohne harten Bezug auf den Basisnamen des neuen Dateinamens funktioniert.

Ich benenne Dateien immer aus irgendeinem Grund um und habe kreative Wege gefunden, Strings mit Powershell zu bearbeiten. Hier ist eine andere Möglichkeit, dies zu tun:

gci *.jpg | Rename-Item -NewName {$_.basename -replace "$($_.basename.split(".")[-1])$","$(290-$_.basename.split(".")[-1])$($_.extension)"} 

Dieser One-Liner kann erneut verwendet werden, um andere Dateien auf dieselbe Weise umzubenennen, unabhängig davon, ob es sich um JPG-, GIF- oder TXT-Dateien handelt. Voraussetzung ist nur, dass der letzte Teil des Basisnamens mit ". #" Endet.

Also, was ist hier los? Um es aufzuschlüsseln, nehmen wir an, dass $ _ derzeit ein [System.IO.FileInfo] -Objekt für die Datei "Vitrine Hinge.12.jpg" ist. Deshalb:

$ _. basename

würde [string] "Vitrine Hinge.12" entsprechen

$_.basename.split(".") 

würde zu einem Array mit den folgenden Einträgen führen:

Door Hinge 12 

Insofern würde sich [1] auf die "12" beziehen. Beachten Sie jedoch, dass ich stattdessen verwendet habe:

$_.basename.split(".")[-1] 

Wenn ich nämlich eine Datei namens "Viterine Hinge.Chrome.12.jpg" hätte, hätte ich auf "Chrome" hingewiesen. Bei Verwendung von [-1] wird das letzte Element im Array angezeigt. Daher ist es nicht wichtig, ob meine Datei andere Punkte im Namen enthält.

OK, also jetzt an dieser Stelle, kapsle ich das in $ () und verwende es in meinem -replace-Operator. Beachten Sie, dass ich das erste Argument mit $ beende, sodass ich am Ende der Zeichenfolge einen regulären Ausdruck finden würde. Auf diese Weise wäre es nicht wichtig, wenn meine Dateien andere Nummern im Namen hätten. Beispielsweise würde "Viterine D00r Knob.0.jpg" nicht in "Viterine D290290r Knob.290.jpg" umbenannt.

Lass mich wissen, wenn etwas verpasst wurde, Prost :)

0
Ryan McVicar

So etwas sollte funktionieren.

Get-ChildItem *.Jpg|%{$SplitName=$_.name -split '\.';$NewNumber= $(([int]$SplitName[1]-290)*-1);$NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.'; Rename-Item $_.name $Newname} 

Ausgebrochen wäre es.

$Files=Get-ChildItem *.jpg Foreach ($File in $files){ $SplitName=$File.name -split '\.'; $NewNumber= $(([int]$SplitName[1]-290)*-1) $NewName=@($SplitName[0],$NewNumber, $SplitName[2]) -join '.' Rename-Item $_.name $Newname } 
Danke, Ryan. Ein FB-Freund half mir aus und kam mit: gci * .jpg | foreach {$ data = $ _. name.Split ("."); $ index = ([int] $ data [1] -290) * (- 1); rni $ _ "Vitrine-Scharnier. $ index.jpg"} L Wright vor 6 Jahren 0
`gci * .jpg | foreach {$ data = $ _. name.Split ("."); $ index = ([int] $ data [1] -290) * (- 1); rni $ _ "Vitrine Hinge. $ index.jpg"} ` L Wright vor 6 Jahren 0