Powershell中按原文件名数值顺序批量重命名MP3为4位序号格式
MP3 文件批量重命名的修正方案
原代码的错位原因
第一版代码无法得到正确顺序的核心原因,是Get-ChildItem *.mp3默认按照文件名的字典字符串规则排序,而非按文件名承载的数字大小排序:比如字符串比对时'10'的首位字符'1'小于'2',就会导致10.mp3被排在2.mp3前面,最终重命名的序号顺序完全错位。
第二版无效代码的问题
第二版尝试的代码有两处核心错误:
- 格式化字符串的参数逻辑错误:把提取到的原文件名数字、自增计数器直接写在一起,既漏了参数分隔的逗号,也误把原文件名的数字当成了要输出的序号值,根本没用到自增计数的逻辑
- 缺失关键排序步骤:全程没有对文件列表按原文件名的数字值做排序,就算语法修正,输出顺序依然是混乱的
正确可运行的代码
$i = 1 Get-ChildItem *.mp3 | Sort-Object { [int]$_.BaseName } | ForEach-Object { Rename-Item $_ -NewName ('{0:D4}.mp3' -f $i++) }
代码逻辑说明
- 在取到mp3文件列表后,先通过
Sort-Object { [int]$_.BaseName }把每个文件的纯数字文件名转成整数,按数值升序排列,完全匹配2、4、6、8…104的预期顺序 - 遍历排好序的文件列表时,从1开始做自增计数,通过
{0:D4}格式化规则生成带前置零的4位数字文件名,刚好实现2.mp3→0001.mp3、4.mp3→0002.mp3的映射关系 - 本场景中原文件名均为偶数序列,和最终生成的连续四位序号不存在文件名重叠的冲突,代码可直接运行
内容的提问来源于stack exchange,提问作者bloomer_xx
相关产品推荐
相关产品推荐

