如何访问嵌套在PSCustomObject中的数组元素?
问题原因分析
你只拿到"Mango"是因为错误地先提取了所有对象的Items属性再按索引取值。比如你可能写了类似这样的代码:
$index = $food.Category.IndexOf("Fruits") $food.Items[$index]
这里$food.Items会把数组里所有对象的Items属性展开合并成一个一维数组:@("Mango", "Pineapple", "Orange", "Tangerine", "Abidjan", "Douala", "Dog", "Bird", "Cat"),当$index为0时,自然只取到第一个元素"Mango"。
正确实现方式
有几种简洁的方法可以直接获取"Fruits"分类下的所有Items:
方法1:用Where-Object过滤(最直观)
直接筛选出Category等于"Fruits"的对象,再提取其Items属性:
$fruitItems = $food | Where-Object { $_.Category -eq "Fruits" } | Select-Object -ExpandProperty Items $fruitItems
输出:
Mango Pineapple Orange Tangerine
方法2:按索引定位对象后取Items
如果一定要用索引方式,得先找到目标对象在$food数组中的索引,再通过索引获取该对象,最后提取它的Items属性:
$index = $food.Category.IndexOf("Fruits") $fruitItems = $food[$index].Items $fruitItems
这样就能拿到完整的水果数组,因为$food[$index]指向的是Category为"Fruits"的自定义对象,再取它的Items就是对应的数组。
方法3:点标记法结合条件(PowerShell 3.0+)
更简洁的写法,直接通过点标记和条件筛选:
$fruitItems = $food[$food.Category -eq "Fruits"].Items $fruitItems
$food.Category -eq "Fruits"会返回布尔数组@($true, $false, $false),用它作为索引传入$food就能直接筛选出目标对象,再提取Items即可。
内容的提问来源于stack exchange,提问作者SavedByJESUS
相关产品推荐
相关产品推荐

