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

How to get a single property value from an array of objects?

我有一个 object 数组:

$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 来查找 return 标题。我想要的只是价值,我不想 return 一个 object。例如,如果查找 guid '2C78DA61-B6EF-4E4E-8FF8-4A95D75C8188',我只想 return 一个字符串值 'Second',而不是带有 [=43= 的 object ] 的值为 'Second'。

我该怎么做?

我试过以下方法:

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

其中 return 是一个散列 table

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

其中 return 是一个具有 {$_.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

然而,他们都很丑。有没有更好的方法 return 只计算值?

这是访问值的另一种方式。

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:>

如果你可以稍微改变你的数据结构,那么对哈希进行哈希可能是最有效和最优雅的解决方案:

$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

另一种选择

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

如果您只需要单个 属性 的值,最简单的方法是将 $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 属性(类似于 建议):

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