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++ } }
关键细节说明
- 分组逻辑调整:如果你的日期不是第一个下划线前的部分,比如格式是
Photo001_20240520_NAME,可以把分组规则改成:
或者用正则精准提取8位数字格式的日期:{ $_.Name -split '_' | Select-Object -Index 1 }{ [regex]::Match($_.Name, '\d{8}').Value } - 排序规则:通过正则提取原Photo后的三位数字转为整数排序,避免文件乱序
- 预览模式:
-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
相关产品推荐
相关产品推荐

