如何从对象数组中获取单个属性值?

时间:2015-04-27 05:41:01

标签: powershell powershell-v4.0

我有一系列对象:

$list = @( `
                @{title='First';guid='0118B390-3AF5-406E-920D-FE140392584D'}, `
                @{title='Second';guid='2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'}, `
                @{title='Third';guid='0EDC361C-862E-41FC-8A60-870CADC17EC5'} `
            )

我想使用guid查找并返回标题。我想要的只是价值,我不想归还一个对象。例如,如果查阅guid' 2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'我只想返回一个字符串值' Second'而不是一个具有值为' Second'的属性的对象。

我该怎么做?

我尝试过以下方法:

$list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'

返回哈希表

$list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188' | select {$_.title}

返回带有{$_.title} NoteProperty的PSObject。

以下两项尝试有效:

($list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188' `
    | select {$_.title}).{$_.title}

($list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188' `
    | select @{Name="result";Expression={$_.title}}).result

但是,它们都很难看。有没有更好的方法只返回价值?

4 个答案:

答案 0 :(得分:5)

另一个选项

($list |?{ $_.guid -eq '0EDC361C-862E-41FC-8A60-870CADC17EC5'}).title

答案 1 :(得分:4)

如果您可以轻松地更改数据结构,那么散列哈希可能是最有效和最优雅的解决方案:

$hashtable = @{}

$hashtable.Add('0118B390-3AF5-406E-920D-FE140392584D', @{title='First';guid='0118B390-3AF5-406E-920D-FE140392584D'})
$hashtable.Add('2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188', @{title='Second';guid='2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'})
$hashtable.Add('0EDC361C-862E-41FC-8A60-870CADC17EC5', @{title='Third';guid='0EDC361C-862E-41FC-8A60-870CADC17EC5'})

然后您可以通过这种方式从guid中检索您的标题:

$hashtable['2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'].title

答案 2 :(得分:2)

如果您只想要单个属性的值,最简单的方法是将$list定义为自定义对象数组并展开该属性:

$list = @(
  [pscustomobject]@{title='First';guid='0118B390-3AF5-406E-920D-FE140392584D'},
  [pscustomobject]@{title='Second';guid='2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'},
  [pscustomobject]@{title='Third';guid='0EDC361C-862E-41FC-8A60-870CADC17EC5'}
)

$list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188' | select -Expand title

但这需要PowerShell v3或更新版本。如果您遇到PowerShell v2或更早版本,或者由于某种原因无法将哈希表转换为自定义对象,您可以在循环中回显title属性(类似于{ {3}}建议):

$list | where guid -eq '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188' | % { $_.title }

答案 3 :(得分:1)

这是访问Value的另一种方法。

PS:> $list = @( `
>>                 @{title='First';guid='0118B390-3AF5-406E-920D-FE140392584D'}, `
>>                 @{title='Second';guid='2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188'}, `
>>                 @{title='Third';guid='0EDC361C-862E-41FC-8A60-870CADC17EC5'} `
>>             )
>>
PS:> $list|%{if($_.ContainsValue('0EDC361C-862E-41FC-8A60-870CADC17EC5')){$_.title}}
Third
PS:>