PowerShell 5.1中ConvertFrom-Json如何不关闭管道输出单个数组成员
问题根源说明
PowerShell 5.1 中 ConvertFrom-Json 的固有设计就是将 JSON 解析得到的完整数组作为单个对象向下传递,不会自动枚举数组内的成员逐个传入管道,这就是你直接接 Where-Object、Select-Object 时命令操作对象是整个数组、不符合预期的原因,该行为在 PowerShell 7+ 版本中已经调整为默认枚举数组成员,但 5.1 环境下需要手动处理。
最优管道式解决方案
无需将命令包裹进括号、完全保留管道写法的方案非常简单,只需要在 ConvertFrom-Json 后追加一节 ForEach-Object { $_ } 即可,该命令会自动枚举输入的数组对象,将数组成员逐个向下游管道传递,完全贴合你想要的 <# objects #> | Where-Object { <# test #> } 写法习惯。如果追求写法简洁,也可以替换为PowerShell通用别名写法 % { $_ },效果完全一致。
修改后的示例二代码如下:
& '.\Stack Overflow Demo 03.ps1' | ConvertTo-JSON | ConvertFrom-Json | ForEach-Object { $_ } | Select-Object -First 1
执行后输出效果和加括号的示例一完全一致,只会返回第一条匹配结果,后续接 Where-Object 做筛选也会按照预期针对单对象判断。
方案优势
- 完全遵循管道流式书写逻辑,不需要中断管道加外层括号
- 写法符合 PowerShell 通用使用规范,客户接受度高
- 无额外性能损耗,和括号包裹的执行效率基本一致
内容的提问来源于stack exchange,提问作者user16136127
相关产品推荐
相关产品推荐

