答案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
}