PowerShell数组排序异常排查及获取最后排序值需求
问题分析与解决
你的脚本排序失效的核心原因是正则匹配逻辑错误:[regex]::Match($_,'\d+')只会提取字符串中第一组连续数字(比如所有Project-a1-xxx里的1),导致所有对象的Numeric属性值都是1,排序自然无法区分顺序。
修正后的脚本
$string = @("Project-a1-1", "Project-a1-10", "Project-a1-2", "Project-a1-5", "Project-a1-6", "Project-a1-8") # 直接通过ForEach-Object输出对象,避免低效的+=操作 $myobjecttosort = $string | ForEach-Object { # 匹配字符串末尾的连续数字,确保拿到最后一段编号 $lastNum = [int]([regex]::Match($_, '\d+$').Value) [PSCustomObject]@{ String = $_ Numeric = $lastNum } } # 按Numeric升序排序,输出表格 $sortedResult = $myobjecttosort | Sort-Object Numeric | Select-Object Numeric, String | Format-Table -AutoSize $sortedResult # 获取排序后的最后一个值 $lastItem = ($myobjecttosort | Sort-Object Numeric)[-1].String Write-Host "`n排序后的最后一个值:$lastItem"
输出结果
执行后会先输出正确排序的表格:
Numeric String ------- ------ 1 Project-a1-1 2 Project-a1-2 5 Project-a1-5 6 Project-a1-6 8 Project-a1-8 10 Project-a1-10
然后输出最后一个值:
排序后的最后一个值:Project-a1-10
关键改动说明
- 正则调整为
\d+$:专门匹配字符串末尾的连续数字,确保提取到的是每个项目的最终编号(比如Project-a1-10里的10)。 - 用
[PSCustomObject]替代New-Object PSObject:语法更简洁,性能更优。 - 避免
$myobjecttosort+=:直接将ForEach-Object的输出赋值给变量,避免数组扩容带来的性能损耗。 - 通过索引
[-1]直接获取排序后的最后一个元素:无需额外遍历,高效简洁。
内容的提问来源于stack exchange,提问作者Dev Developer
相关产品推荐
相关产品推荐

