如何根据名称匹配过滤对象?

时间:2018-06-08 20:25:22

标签: powershell

我要返回很多想要过滤的数据。酒店的名称包含此信息。我习惯基于| ? {$_.Name -eq 'Value'}进行过滤。我希望能够使用隐藏的.pscustomobject更动态地执行此操作。

$x = [pscustomobject]@{
   atruevalue = 'sometext'
   afalsevalue = 'sometext'
}

$x | ?{$_.psobject.Properties.Name -like '*true*'}

我希望这会回来:

> atruevalue
> ----------  
> sometext

但是,它只返回对象中的每个项目。

有人可以解释这种行为吗?

3 个答案:

答案 0 :(得分:5)

如果你真的想要过滤属性,那么移动一下就可以了。这看起来像是:

$x.psobject.Properties | ? {$_.Name -like '*true*'}

如果您只想要值而不是属性,那么在管道中添加另一个阶段:

$x.psobject.Properties | ? {$_.Name -like '*true*'} | % Value

答案 1 :(得分:2)

Where-object过滤器输入的行,你的例子。

要过滤列,您需要选择对象。

$x = [pscustomobject]@{
      atruevalue = 'sometext'
      afalsevalue = 'sometext'
      atruenightmare = 'someothertext'}    
> $x|select ($x.psobject.properties|? name -like '*true*').Name

atruevalue atruenightmare
---------- --------------
sometext   someothertext

答案 2 :(得分:2)

Bruce Payette's helpful answer显示了最简单的解决方案。

至于:

  

有人可以解释这种行为吗?

?Where-Object cmdlet的内置别名,充当过滤器,这意味着如果过滤条件每个输入评估的脚本块({ ... })的形式求值为$True,手头的输入对象(在脚本块内表示为$_)通过原样

换句话说:脚本块检查的输入对象的特定属性是无关紧要的 - 如果条件求值为$True,则整个输入对象将被传递。< / p>