以下对象是一个玩具示例,用于说明我的问题:
$food = @(
[PSCustomObject]@{Category = "Fruits"; Items = @("Mango", "Pineapple", "Orange", "Tangerine")},
[PSCustomObject]@{Category = "Cities"; Items = @("Abidjan", "Douala")},
[PSCustomObject]@{Category = "Animals"; Items = @("Dog", "Bird", "Cat")}
)
$food
Category Items
-------- -----
Fruits {Mango, Pineapple, Orange, Tangerine}
Cities {Abidjan, Douala}
Animals {Dog, Bird, Cat}
例如,我想访问
"Fruits"
类别的所有项目。我尝试首先确定 "Fruits"
属性中 Category
的索引,然后在 "Items"
属性中使用它。我以为会返回整个水果名称数组;然而,它并没有按预期工作:
$i = $food.Category.IndexOf("Fruits")
$food[$i]
$food.Items[$i]
Mango
我该怎么办?
谢谢你。
您需要将索引
$i
应用于 $food
数组本身:
$food[$i].Items
但是,更符合 PowerShell 习惯的解决方案是:
($food | Where-Object Category -eq Fruits).Items
您需要循环遍历
$food
数组中的每个元素,以查找具有 Category
等于 Fruits
属性的对象,然后展开 Items
属性。 PowerShell 中最常用的 3 种过滤技术是:
Where-Object
:
$food | Where-Object Category -EQ Fruits |
ForEach-Object Items
.Where
方法:
$food.Where({ $_.Category -eq 'Fruits' }).Items
带有
foreach
条件的经典 if
循环:
foreach ($item in $food) {
if ($item.Category -eq 'Fruits') {
$item.Items
}
}