如何在PowerShell中按自然顺序选择并排序Zip文件?
PowerShell实现文件名自然排序的方法
我有这些文件:
Test1.zip Test2.zip Test3.zip Test10.zip Test11.zip
在PowerShell里执行以下命令时:
Get-ChildItem -Path "c:\temp" -Filter "*.zip" | Sort-Object
得到的是字符串排序结果,数字顺序不符合预期:
Test1.zip Test10.zip Test11.zip Test2.zip Test3.zip
想要调整成自然数字顺序:
Test1.zip Test2.zip Test3.zip Test10.zip Test11.zip
解决方法
方法1:针对固定格式文件名(前缀统一)
如果文件名都是类似Test+数字.zip的固定格式,可以直接提取数字部分转成整数排序:
Get-ChildItem -Path "c:\temp" -Filter "*.zip" | Sort-Object { [int]($_.BaseName -replace '[^\d]','') }
原理是通过正则去掉文件名中的非数字字符,提取出数字并转为整数,再按整数大小排序,结果就是自然数字顺序。
方法2:通用自然排序(适配任意含数字的文件名)
如果文件名格式不固定,比如有不同前缀或数字在任意位置,用补零法让字符串排序等价于自然排序:
Get-ChildItem -Path "c:\temp" -Filter "*.zip" | Sort-Object { [regex]::Replace($_.Name, '(\d+)', { $matches[1].PadLeft(10, '0') }) }
这个方法会把文件名里的所有数字部分补零到10位长度,比如Test1.zip变成Test0000000001.zip,Test10.zip变成Test0000000010.zip,此时字符串排序就会和自然数字顺序一致。
内容的提问来源于stack exchange,提问作者Melissa
相关产品推荐
相关产品推荐

