为什么PowerShell管道对ConvertFrom-Json转换的对象不生效?
核心原因
- PowerShell 5.1 中
ConvertFrom-Json解析JSON得到的数组会作为单个整体对象输出到管道,不会自动拆分数组元素逐个传递。 - 第一种写法中,
Where-Object接收到的输入是包含3个元素的完整数组对象,而非逐个传入的水果对象。此时执行$_.Name -eq 'banana'判断时,PowerShell的成员枚举特性会读取数组内所有元素的Name属性,返回的banana字符串属于非空真值,因此Where-Object会将整个数组对象直接返回,最终展开呈现为3个全部对象,不符合筛选预期。
括号写法的生效逻辑
用括号包裹命令时,PowerShell会优先完成括号内的所有执行逻辑,拿到完整的数组结果后,会自动枚举数组内的所有元素,逐个传递给下游的Where-Object。此时每个水果对象单独进入筛选逻辑,Name属性判断可以正常生效,最终仅返回匹配的banana对象。
兼容方案补充
除了加括号的写法,你也可以通过手动枚举的方式实现相同效果:
$data | ConvertFrom-Json | ForEach-Object { $_ } | Where-Object { $_.Name -eq 'banana' }
注:该行为仅存在于PowerShell 5.1及更早版本,PowerShell 7+版本中
ConvertFrom-Json默认会自动枚举数组元素,两种写法的执行结果一致。
内容的提问来源于stack exchange,提问作者DarkLite1
相关产品推荐
相关产品推荐

