我有一个 PS 脚本,其中包括以下内容:
Get-ChildItem | foreach {
$c++
$newname = "$($c)-TZ.jpg".Padleft(10,'0')
Rename-Item $_ -NewName $newname
}
过去,这项任务曾在包含如下内容的文件夹上运行:
001.jpg
002.jpg
...
037.jpg
它工作正常,只需插入-TZ
但是现在我要对包含以下内容的文件夹运行它:
07.jpg
08.jpg
09.jpg
010.jpg
并且它将其放在第一位(当我想要第一个文件时,010.jpg
将其重命名为,即变成)。001-TZ.jpg
07.jpg
001-TZ.jpg
我猜这是因为它在对文件进行排序时将数字视为字母(或者我猜您可以说是小数)。是否可以以某种方式进行更改,以便将其视为07
小于010
?
答案1
如果仅允许文件名中的数字决定“新名称”就足够了,则不需要递增计数器。将文件名的数字部分保存到变量中,将其添加到迭代的文件对象中作为Add-Member
值-NotePropertyName
,然后按其名称排序以获得首选排序顺序。
本质上这会将匹配的数字值用零填充至 3 个字符和然后当你按对象上的这些值排序时,排序顺序将是正确的以满足您的需要。
如果你绝对需要柜台并且文件名数字本身不能用于新文件名,那么这可以让你将其重新融入到组合中和仍然可以解决你的问题——按“defined”属性对结果进行排序——然后rename-item
进行操作。
电源外壳
Get-ChildItem | foreach {
###if ($_.Name -match "\d+"){$matches}else{$false};
###if ($_.Name -match "\d+"){$matches.Values}else{$false};
$cName = if($_.Name -match "\d+"){[string]$matches.Values.PadLeft(3,"0")}else{$false};
$_ | Add-Member -NotePropertyName "cName" -NotePropertyValue $cName;
$_ | Select *;
} } | Sort cName | foreach {Rename-Item $_.FullName -NewName "$($_.BaseName.Padleft(10,'0'))$($_.Extension)"};