我有一堆png文件,其中大多数都有以数字区分的共享文件名。例如,我可能有文件:
不幸的是,这些编号系统从1开始提供,我需要它从0开始。所以我需要将我的文件重命名为:
(请注意,最终文件名中前导零的数量无关紧要,但我可能在输入文件名中混合使用。)
我发现了许多用于删除或替换部分文件名的PowerShell解决方案,但没有涉及对文件名中的数字执行操作。
我尝试使用正则表达式来查找数字并捕获匹配项,但我不知道如何对其进行数值运算。我得到了:
Get-ChildItem *.png |Rename-Item -NewName {$_.name -replace "([0-9]+).png",'$1.png'}
当然没有做任何事情 - 它只是匹配数字,然后用相同的数字替换它。我希望最后有'$1'-1
之类的东西,但当然$1
是一个字符串。我不确定是否必须将其转换为整数,执行操作,然后转换回字符串并替换它,如果是,我不知道该怎么做。 (我对完全重写很满意。)
由于我是PowerShell的初学者,我更倾向于明确而不是直接性,当然,对解决方案中步骤的任何解释都会非常感激。
答案 0 :(得分:1)
尝试这样的事情:
$Names = "file_A_01.png","file_A_02.png","file_B_1.png","file_B_2.png","file_C.png"
foreach($Name in $Names){
$Number = [Double]$([Regex]::Matches($Name, "\d+")).Value
if($Number -ne 0){
$Number = $Number - 1
$Name = $Name -replace $([Regex]::Matches($Name, "\d+")).Value , $Number
}
$Name
}
答案 1 :(得分:0)
如果您想保留前导零(将A:\
更改为您的路径):
PushD "A:\"
Get-ChildItem "file*_*[0-9].png" | Sort Name | ForEach-Object {
$Number = ($_.BaseName -split '_')[-1]
$Places = $Number.Length
If ([Int32]$Number -gt 0) {
$NewNum = ([Int32]$Number - 1).ToString('00000')
$NewNum = $NewNum.Substring($NewNum.Length-$Places)
$_|Rename-Item -NewName {($($_.BaseName) -Replace "$Number$","$NewNum")+$($_.Extension)} -Whatif
}
}
PopD
示例输出:
PS A:\> .\SO_44717299.ps1
What if: Performing the operation "Rename File" on target "Item: A:\file_A_01.png Destination: A:\file_A_00.png".
What if: Performing the operation "Rename File" on target "Item: A:\file_A_02.png Destination: A:\file_A_01.png".
What if: Performing the operation "Rename File" on target "Item: A:\file_B_1.png Destination: A:\file_B_0.png".
What if: Performing the operation "Rename File" on target "Item: A:\file_B_2.png Destination: A:\file_B_1.png".
What if: Performing the operation "Rename File" on target "Item: A:\file_C_001.png Destination: A:\file_C_000.png"
如果输出看起来没问题,请删除Rename-Item
后面的-WhatIf