使用powershell减少文件名末尾的数字

时间:2017-06-23 09:00:24

标签: powershell

我有一堆png文件,其中大多数都有以数字区分的共享文件名。例如,我可能有文件:

  • file_A_01.png
  • file_A_02.png
  • file_B_1.png
  • file_B_2.png
  • file_C.png

不幸的是,这些编号系统从1开始提供,我需要它从0开始。所以我需要将我的文件重命名为:

  • file_A_00.png
  • file_A_01.png
  • file_B_0.png
  • file_B_1.png
  • file_C.png

(请注意,最终文件名中前导零的数量无关紧要,但我可能在输入文件名中混合使用。)

我发现了许多用于删除或替换部分文件名的PowerShell解决方案,但没有涉及对文件名中的数字执行操作。

我尝试使用正则表达式来查找数字并捕获匹配项,但我不知道如何对其进行数值运算。我得到了:

Get-ChildItem *.png  |Rename-Item -NewName {$_.name -replace "([0-9]+).png",'$1.png'}

当然没有做任何事情 - 它只是匹配数字,然后用相同的数字替换它。我希望最后有'$1'-1之类的东西,但当然$1是一个字符串。我不确定是否必须将其转换为整数,执行操作,然后转换回字符串并替换它,如果是,我不知道该怎么做。 (我对完全重写很满意。)

由于我是PowerShell的初学者,我更倾向于明确而不是直接性,当然,对解决方案中步骤的任何解释都会非常感激。

2 个答案:

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