我想使用Where-Object来简化我的代码并使用powershell函数。
考虑这两个列表
$list = @('A','B','C')
$list2=@{'A'=1;'B'=2;'E'=3}
我想要做的是在$ list中查找$ list2中所有键的项目。我可以用正常的琐碎方式做到这一点。
$r = @()
foreach ($t in $list)
{
$t
if ($list2.ContainsKey($t))
{
$r+=$t
}
}
上面的代码有效,但是当我发出以下命令时
$r = $list | Where-Object $list2.Keys.contains($_)
Powershell并不高兴,并表示该方法不受支持。我认为这应该是可以实现的,但我不知道如何发出正确的命令。如果这是可行的,请提供帮助,因为我的脚本似乎过于冗长。
答案 0 :(得分:1)
您需要在Where-Object
{}
中包含您正在评估的条件,以评估为ScriptBlock。其次,contains()
方法将为$list2
的每个成员返回一个布尔值,因此如果返回的数组包含值$True
,您将需要评估该语句。
$r = $list | Where-Object {($list2.Keys.contains($_)) -contains $True}
或者,您可以在.contains()
哈希表本身上使用$list2
方法,并避免为每个键获取值。
$r = $list | Where-Object {$list2.contains($_)}