如何在PowerShell中批量重命名文件并为前缀数字补零填充
解决方案
你之前尝试补零报错的核心原因是:-replace 运算符的默认替换参数是纯字符串模板,不能直接执行PowerShell表达式,你写的{0:D2}、.PadLeft会被当成普通文件名的一部分,生成包含大括号等非法字符的文件名,所以触发系统报错。
兼容所有PowerShell版本的实现
这是最稳妥的写法,还自带过滤逻辑,不会误改不匹配规则的文件:
# 先加-WhatIf预览重命名结果,确认无误后删除-WhatIf再执行 Get-ChildItem -Path *.mp3 | Rename-Item -NewName { if ($_.Name -match '^ABCDEF_S3L(\d{1,2})_\d{6}_GHIJK\.mp3$') { $lessonNumber = [int]$matches[1] return "{0:D2}-lesson.mp3" -f $lessonNumber } # 不匹配规则的文件保持原名 $_.Name } -WhatIf
逻辑说明:
- 先用
-match正则匹配提取L后面的数字,存储到自动变量$matches[1] - 将提取到的字符串数字转为整型,再用格式化运算符
-f转为两位固定长度的字符串,1~9会自动补前导零 - 不匹配命名规则的文件不会被修改,避免误操作
PowerShell 7+ 简化写法
PowerShell 7及以上版本支持-replace的回调函数写法,可以直接在替换逻辑里做格式化:
# 同样先加-WhatIf预览 Get-ChildItem -Path *.mp3 | Rename-Item -NewName { $_.Name -replace '^ABCDEF_S3L(\d{1,2})_\d{6}_GHIJK\.mp3$', { "{0:D2}-lesson.mp3" -f [int]$_.Groups[1].Value } } -WhatIf
注意事项
- 所有操作务必先加
-WhatIf参数预览重命名结果,确认输出的新文件名符合预期后再删除-WhatIf实际执行 - 如果目录内还有其他非目标MP3文件,建议先将目标文件单独转移到空文件夹后再执行操作
内容的提问来源于stack exchange,提问作者MouseMan
相关产品推荐
相关产品推荐

