Powershell where对象的使用

Powershell where对象的使用,powershell,Powershell,我想使用Where对象来简化我的代码并使用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 } } 上面的代码可以工作,但是当我发出下

我想使用Where对象来简化我的代码并使用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不高兴,并表示不支持该方法。我认为这应该是可以实现的,但我不知道如何发出适当的命令。如果这是可行的,请提供帮助,因为我的脚本似乎太冗长。

您需要在{}中的Where对象中包装您正在计算的条件,以作为ScriptBlock进行计算。其次,contains方法将为$list2的每个成员返回一个布尔值,因此您需要计算该语句,以确定返回的数组是否包含值$True

或者,您可以在$list2哈希表本身上使用.contains方法,避免为每个键获取一个值

$r = $list | Where-Object {$list2.contains($_)}

哈希表没有排序。输出应该是什么?您想要单个输出吗?$list中至少有一项是散列中的键,或者…?谢谢,Ben!你介意详细说明一下你建议的两种方法吗?这两种方式都很有魅力,但我对脚本的理解有点模糊。我认为list2.Keys.Contains和$list2.Contains都会返回逻辑值true或false?但事实上,只有第二个会这样做,因为如果我们不显式地过滤掉false,第一个会返回所有的值true或false。这是为什么?@user1205746在使用时首先检查每个键,而不是整个哈希表$Keys是一个键数组$list2是整个哈希表。是的,但是结果仍然应该是true或false,不是吗?如果我错过了一些东西,我深表歉意,因为我对PowerShell非常熟悉。这是真/假,但每把钥匙对应一把。
$r = $list | Where-Object {$list2.contains($_)}