如何在PowerShell中循环前正确排序带数字前缀的Windows更新MSU文件
如何按数字前缀正确排序Windows更新MSU文件?
你遇到的问题是典型的字符串字典序排序 vs 数值排序的差异——默认的Sort-Object Name是按字符串逐个字符比较的,所以"10"会排在"2"前面(因为第一个字符'1'的ASCII码比'2'小)。要实现按文件名开头的数字顺序排序,我们需要把前缀的数字提取出来并转换成整数,再基于这个数值排序。
这里有两种简单的解决方案:
方案1:通过分割文件名提取数字
利用文件名的#_FILENAME格式,直接分割下划线获取前缀数字,转成整数后排序:
Get-ChildItem -Path "PATH HERE" -Recurse | Where-Object {$_.Name -like "*msu*"} | Sort-Object -Property @{Expression={[int]($_.Name.Split('_')[0])}} | ForEach-Object{ Write-Host $_.Name }
方案2:用正则表达式提取数字(更健壮)
如果担心文件名格式有微小变化(比如分隔符不是下划线),可以用正则匹配开头的数字部分:
Get-ChildItem -Path "PATH HERE" -Recurse | Where-Object {$_.Name -like "*msu*"} | Sort-Object -Property @{Expression={[int]($_.Name -replace '^(\d+)_.*','$1')}} | ForEach-Object{ Write-Host $_.Name }
原理说明
两种方案的核心都是:
- 从文件名中提取开头的数字字符串
- 把字符串转换成
[int]整数类型 - 让
Sort-Object基于整数数值排序,这样就能得到1、2、3...10、11的自然顺序了
测试一下,你就能看到文件会按1到31的正确顺序输出啦。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

