You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell批量重命名非连续编号照片文件问题求助

PowerShell批量重命名照片:修复编号不连续问题

问题根源

你用的"Photo???"是CMD的通配符语法,但PowerShell的-replace运算符基于正则表达式,???在正则里不是匹配三个任意字符,会被当成字面量处理,直接导致语法错误。另外原脚本还存在两个问题:

  • 语法错误:("Photo{0:d3}" -f {1},$nr++)里的{1}完全多余,属于无效参数
  • 未按日期分组:所有文件会统一编号,跨日期的照片编号会连续,不符合你的需求

解决方案:按日期分组重命名

下面的脚本会自动按日期分组,每组内重新生成连续的三位编号,保留原文件名的其他部分:

# 按文件名中的日期前缀分组(假设日期是第一个下划线前的部分,比如20240520_Photo001_NAME)
Get-ChildItem | Group-Object -Property { $_.Name -split '_' | Select-Object -First 1 } | ForEach-Object {
    $currentNr = 1
    # 按原照片编号排序,确保顺序和原文件一致
    $_.Group | Sort-Object -Property { [int]($_.Name -replace '.*Photo(\d{3}).*', '$1') } | ForEach-Object {
        # 替换原PhotoXXX为新的连续三位编号
        $newFileName = $_.Name -replace 'Photo\d{3}', "Photo$($currentNr.ToString('d3'))"
        # -WhatIf参数用于预览修改,确认无误后删除该参数执行实际重命名
        $_ | Rename-Item -NewName $newFileName -WhatIf
        $currentNr++
    }
}

关键细节说明

  1. 分组逻辑调整:如果你的日期不是第一个下划线前的部分,比如格式是Photo001_20240520_NAME,可以把分组规则改成:
    { $_.Name -split '_' | Select-Object -Index 1 }
    
    或者用正则精准提取8位数字格式的日期:
    { [regex]::Match($_.Name, '\d{8}').Value }
    
  2. 排序规则:通过正则提取原Photo后的三位数字转为整数排序,避免文件乱序
  3. 预览模式:-WhatIf参数会显示将要执行的重命名操作,不会实际修改文件,确认没问题后再去掉

简化版(单日期场景)

如果所有文件属于同一个日期,不需要分组,直接用下面的脚本:

$currentNr = 1
Get-ChildItem | Sort-Object -Property { [int]($_.Name -replace '.*Photo(\d{3}).*', '$1') } | ForEach-Object {
    $newFileName = $_.Name -replace 'Photo\d{3}', "Photo$($currentNr.ToString('d3'))"
    $_ | Rename-Item -NewName $newFileName -WhatIf
    $currentNr++
}

内容的提问来源于stack exchange,提问作者Skipper1240

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:37:19