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”的属性,我只是没有把它放在我的初始示例中。谢谢