PowerShell从多JSON对象提取Manufacturer值无输出的问题咨询
PowerShell提取多个JSON对象中Manufacturer值的问题解决
问题根源
你的代码在单个对象测试有效、批量循环失效,核心原因是:批量解析JSON数组后得到的是PSCustomObject集合,而GetEnumerator()方法对PSCustomObject的默认行为和哈希表不同——它不会枚举对象的属性成员,导致Where-Object找不到任何匹配项,自然没有输出。单个测试时你大概率用的是哈希表,所以能正常工作。
两种解决办法
方法1:直接访问属性(最简洁高效)
既然每个JSON对象都包含Manufacturer属性,完全不需要用Where-Object绕弯,直接用点语法访问即可:
foreach($item in $table) { Write-Host $item.Manufacturer }
方法2:适配PSCustomObject的枚举逻辑
如果需要兼容属性可能不存在的场景,或者一定要用枚举方式,可以先把PSCustomObject转为哈希表,再执行枚举筛选:
foreach($item in $table) { # 将PSCustomObject转为哈希表 $hashItem = [hashtable]$item $result = $hashItem.GetEnumerator() | Where-Object { $_.Key -eq 'Manufacturer'} if($result) { Write-Host $result.Value } }
或者通过Get-Member筛选属性后再访问:
foreach($item in $table) { $targetProp = $item | Get-Member -MemberType NoteProperty | Where-Object Name -eq 'Manufacturer' if($targetProp) { Write-Host $item.$($targetProp.Name) } }
补充说明
当使用ConvertFrom-Json解析JSON数组时,PowerShell会返回PSCustomObject的数组,而非哈希表数组,这是原代码无法批量生效的关键。直接用点语法访问属性是性能最优、代码最简洁的方案,优先推荐。
内容的提问来源于stack exchange,提问作者MarkCo
相关产品推荐
相关产品推荐

