PowerShell批量重命名分组文件时自动编号避免重名报错咨询
PowerShell 按文件名标识分组批量重命名方案
原脚本问题说明
原有脚本仅通过固定位置截取字符串生成新文件名,没有对相同中间标识的文件做分组计数,同组文件会生成完全重复的文件名,触发系统重名报错导致文件被跳过。
可直接使用的修正脚本
脚本逻辑为先按下划线拆分文件名提取中间段作为分组key,同组内自动生成从1开始的递增序号,完全避免重名问题:
# 获取当前目录下所有待处理文件,仅匹配文件不处理文件夹 Get-ChildItem -File -Filter *.jpg | # 按下划线拆分文件名,取第二段作为分组标识 Group-Object { $_.BaseName.Split('_')[1] } | ForEach-Object { $fileGroup = $_.Group # 组内从1开始生成递增序号 for ($index = 0; $index -lt $fileGroup.Count; $index++) { $targetName = "{0}_{1}{2}" -f $_.Name, ($index + 1), $fileGroup[$index].Extension Rename-Item -LiteralPath $fileGroup[$index].FullName -NewName $targetName } }
脚本说明
- 分组逻辑完全匹配当前命名规则:针对
xxx_分组标识_xxx.后缀格式的文件,自动提取中间段作为分组依据 - 每组独立维护计数器,同组序号从1开始递增,不会出现跨组混编、同组重名的问题
- 先完成全量文件分组枚举再执行重命名,避免边遍历边修改文件名导致的重复处理、漏处理问题
- 用
-LiteralPath参数处理文件,兼容带特殊字符的文件名,不会出现路径解析错误
使用注意事项
- 如果需要处理所有格式文件而非仅jpg,删除
-Filter *.jpg参数即可 - 如果需要调整组内编号排序规则(比如按文件创建时间、修改时间排序编号),可在
Get-ChildItem命令后追加排序逻辑,例如按创建时间升序编号:Get-ChildItem -File -Filter *.jpg | Sort-Object CreationTime | Group-Object { $_.BaseName.Split('_')[1] } - 首次执行前可将
Rename-Item行替换为以下命令预览重命名结果,确认规则符合预期后再执行实际重命名:Write-Host "原文件名: $($fileGroup[$index].Name) -> 新文件名: $targetName"
内容的提问来源于stack exchange,提问作者Pepe
相关产品推荐
相关产品推荐

