Select 如何根据对象属性的值(无论属性名称如何)筛选对象列表
我有一个与此类似的对象列表:Select 如何根据对象属性的值(无论属性名称如何)筛选对象列表,select,powershell,filter,filtering,powershell-2.0,Select,Powershell,Filter,Filtering,Powershell 2.0,我有一个与此类似的对象列表: $srvobj = New-Object PSObject -Property @{ "Prop1" = Do-Something $value "Prop2" = Do-SomethingElse $othervalue "Prop3" = Do-AnotherThing $thirdvalue } 根据传递给函数的每个变量的值,Prop1、Prop2和Prop3的对象将具有不同的值。有没有一种方法可以过滤对象列表,以便我只返回属性之一设
$srvobj = New-Object PSObject -Property @{
"Prop1" = Do-Something $value
"Prop2" = Do-SomethingElse $othervalue
"Prop3" = Do-AnotherThing $thirdvalue
}
根据传递给函数的每个变量的值,Prop1、Prop2和Prop3的对象将具有不同的值。有没有一种方法可以过滤对象列表,以便我只返回属性之一设置为false的对象?例:
$obj1 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $true
"Prop3" = $true
}
$obj2 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $false
"Prop3" = $true
}
$objarray = @($obj1, $obj2)
$fails = $objarray | Where-Object { $_ -contains $false }
如果我在上面的伪代码中回显$fails
,它将只返回$obj2
,因为其中一个属性的值为false
我知道可以检查每个属性的每个值,然后手动将它们添加到新数组中;但问题是我有很多对象,有很多属性(比我在本例中展示的更多)
有没有办法过滤掉对象数组,这样我就只能得到我需要的对象?试试这个:
$fails = $objArray | % {
$obj = $_
$obj.PSObject.Properties | % {
if ($_.Value -eq $false) {
$obj
}
}
}
PSObject是所有PSObject上的一个隐藏属性,它包含有关该对象的一组信息,包括能够遍历属性。好的,我们将向自定义对象添加一个额外的成员,以便它们在添加到数组中后记住自己是谁。然后我们将使用
-match
进行过滤,我们将得到您想要的
$obj1 = New-Object PSObject -Property @{
"Name" = "Obj1"
"Prop1" = $true
"Prop2" = $true
"Prop3" = $true
}
$obj2 = New-Object PSObject -Property @{
"Name" = "Obj2"
"Prop1" = $true
"Prop2" = $false
"Prop3" = $true
}
$objarray = @($obj1, $obj2)
$fails = $objarray | Where-Object { $_ -match $false }
我想如果您真的希望它返回
$obj2
,您可以将$
转义为Name值,如“Name”=
“`$obj2”
,这是一种可能的解决方案:
$obj1 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $true
"Prop3" = $true
}
$obj2 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $false
"Prop3" = $true
}
$objarray = @($obj1, $obj2)
$objarray | Where-Object {
$obj = $_
$obj | gm -MemberType Properties | % {
if($obj."$($_.Name)" -eq $false) { $true }
}
}
或者更简单:
$obj1 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $true
"Prop3" = $true
}
$obj2 = New-Object PSObject -Property @{
"Prop1" = $true
"Prop2" = $false
"Prop3" = $true
}
$objarray = @($obj1, $obj2)
$objarray | ? { $_.psobject.Properties | ? { $_.Value -eq $false } }
这正是我所需要的;我不知道这有那么容易。我已经有了“Name”的属性,我只是没有把它放在我的初始示例中。谢谢