PowerShell 5.1:单行语句排序JSON数组失效,两行正常的原因
PowerShell 5.1单行管道排序失效的原因
在PowerShell 5.1环境中,读取JSON数组并按Version属性降序排序时,单行管道语句无法得到预期排序结果,但拆分为两行却能正常生效,核心差异源于ConvertFrom-Json的输出行为以及排序逻辑的隐性区别:
代码示例
【正常生效】
$versions = Get-Content $jsonFilePath | Out-String | ConvertFrom-Json $versions = $versions | Sort-Object -Descending -Property Version
【无法生效】
$versions = Get-Content $jsonFilePath | Out-String | ConvertFrom-Json | Sort-Object -Descending -Property Version
补充JSON内容
[ { "UIVersion": "2024.21.5", "Version": "12.5.1.1" }, { "UIVersion": "2024.20.15", "Version": "12.5.1" }, { "UIVersion": "2024.20.10", "Version": "12.5" }, { "UIVersion": "2024.20.9", "Version": "12.3.6" }, { "UIVersion": "2024.20.7", "Version": "12.3.6" }, { "UIVersion": "2024.20.1", "Version": "12.3.6" }, { "UIVersion": "2024.20.6.2", "Version": "12.3.6" }, { "UIVersion": "2024.20.100", "Version": "12.3.6" }, { "UIVersion": "2024.20.200", "Version": "12.3.6" }, { "UIVersion": "2024.20.9.1", "Version": "12.3.6" }, { "UIVersion": "2024.26.3.1", "Version": "12.3.6" } ]
差异原因
ConvertFrom-Json的输出行为差异:- 直接赋值给变量时,
ConvertFrom-Json返回完整的PSCustomObject[]数组对象; - 放入管道时,PowerShell会自动展开数组,将每个元素逐个传递给后续的
Sort-Object。
- 直接赋值给变量时,
排序逻辑的隐性区别:
理论上两种方式排序结果应一致,但PowerShell 5.1中存在隐性行为:当Sort-Object接收逐个传递的元素时,对于字符串类型的Version属性,会严格按字符顺序排序(而非版本号逻辑),可能导致结果不符合预期;而先将数组赋值给变量再排序时,Sort-Object对整个数组的处理更稳定,更容易保证排序逻辑的一致性。版本号排序的修正方案:
若需按版本号而非字符顺序排序,无论单行还是两行,都应将Version属性转换为[version]类型,修正后的单行代码如下:$versions = Get-Content $jsonFilePath | Out-String | ConvertFrom-Json | Sort-Object -Descending -Property { [version]$_.Version }
内容的提问来源于stack exchange,提问作者Craig
相关产品推荐
相关产品推荐

