我可以使用contains来匹配对象属性的值吗?

时间:2017-10-01 22:27:12

标签: windows powershell

我可以使用像这样的包含:

myArr= 'aaa','bbb','ccc'
myArr -contains 'aaa'

但是我可以在一个对象数组上使用它吗?假设我有一个对象数组,我想知道他们的'someProp'属性是否等于某个值?

这不起作用,但我想做这样的事情

myArr = #an array of objects
myArr -contains @{someProp = 'hasThisValue'}

3 个答案:

答案 0 :(得分:2)

您不能使用该语法,但可以使用略有不同的语法:

$myarr.someprop -contains 'hasthisvalue'

使用集合的属性,PowerShell会创建一组属性值,因此-contains的工作方式与您期望的一样。

答案 1 :(得分:0)

有趣的问题。 我说可以使用Compare-Object cmdlet。

我在我的结尾做了一些测试,如果您有对象的引用,-contains似乎将按预期的方式工作。如果您尝试使用包含不是引用的相同对象的contains,则它将失败。

以此为例。

$myArr = @(@{'Item 1'='Value 1'},@{'Item 2'='Value 2'},@{})
$ItemByVal= @{'Item 1'='Value 1'}
$ItemByRef = $myArr | select -First 1

Write-host "Compare using Contains by val: $($myArr -contains $UtemByVal)" -ForegroundColor Red
Write-Host "Comapre using contains By ref: $($myArr -contains $ItemByRef)" -ForegroundColor Green

ItemByVal无法使用contains工作。

尽管使用这两种方法,Compare-Object cmdlet仍然可以正常工作。您可以通过引用或值来使用它。

Compare-Object $myArr $ItemByVal -ExcludeDifferent -IncludeEqual -PassThru
Compare-Object $myArr $ItemByRef -ExcludeDifferent -IncludeEqual -PassThru

output

答案 2 :(得分:0)

你必须使用解释@Mike Shepard这样的属性。 您可以像这样使用-in:

$myArr = @{PropName1='Value 1';PropName2='test1'},@{PropName1='Value 2';PropName2='test2'}
"Value 1" -in $myArr.PropName1