我要返回很多想要过滤的数据。酒店的名称包含此信息。我习惯基于| ? {$_.Name -eq 'Value'}
进行过滤。我希望能够使用隐藏的.pscustomobject
更动态地执行此操作。
$x = [pscustomobject]@{
atruevalue = 'sometext'
afalsevalue = 'sometext'
}
$x | ?{$_.psobject.Properties.Name -like '*true*'}
我希望这会回来:
> atruevalue
> ----------
> sometext
但是,它只返回对象中的每个项目。
有人可以解释这种行为吗?
答案 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>