通过计算一个值并将其用于新名称来批量重命名文件

通过计算一个值并将其用于新名称来批量重命名文件

我有几百张 JPG 需要重命名。我需要将以下简单公式应用于每个文件名中的现有数字:

(x-290)*-1

“Vitrine Hinge.0.jpg”将变成“Vitrine Hinge.290.jpg”,“Vitrine Hinge.1.jpg”将变成“Vitrine Hinge.289.jpg”,依此类推。

一些有问题的文件

我使用了以下方法:

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

我收到了错误。

答案1

Ryan 的回答很好,因为它不需要严格引用新文件名的基本名称就可以工作。

我总是出于各种原因重命名文件,并找到了使用 powershell 操作字符串的创造性方法。以下是另一种方法:

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

可以重复使用此单行代码以相同方式重命名其他文件,无论它们是 jpg、gif 还是 txt 文件。唯一的要求是基本名称的最后一部分以“.#”结尾

那么,这里发生了什么?具体来说,假设 $_ 当前是文件“Vitrine Hinge.12.jpg”的 [System.IO.FileInfo] 对象。因此:

$_.basename

等于 [string]“Vitrine Hinge.12”

$_.basename.split(".")

将产生包含以下条目的数组:

Door Hinge
12

因此,[1] 指的是“12”。但是,请注意,我改用了:

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

这是因为,如果我有一个名为“Viterine Hinge.Chrome.12.jpg”的文件,我会引用“Chrome”。使用 [-1] 将返回数组中的最后一项,因此,如果我的文件名称中包含其他句点,则不会有任何问题。

好的,现在,我将其封装在 $() 中,并在我的 -replace 运算符中使用。请注意,我以 $ 结尾第一个参数,这样我就可以在字符串末尾进行正则表达式匹配。这样,如果我的文件名称中有其他数字,那就没关系了。例如,“Viterine D00r Knob.0.jpg”将不是重命名为“Viterine D290290r Knob.290.jpg”

如果遗漏了什么请告诉我,谢谢 :)

答案2

类似这样的事情应该有效。

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

这将是一场爆发。

$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
}

相关内容