【问题标题】:Group-Object AsHashTable doesn't work for ScriptPropertyGroup-Object AsHashTable 不适用于 ScriptProperty
【发布时间】:2020-08-17 05:40:53
【问题描述】:

作品:

$Names = 1..5 | % { new-object psobject | add-member -Type NoteProperty -Name Name -Value "MyName" -PassThru } | group Name -AsHashTable
$Names.MyName

不起作用:

$Names = 1..5 | % { new-object psobject | add-member -Type ScriptProperty -Name Name -Value {"MyName"} -PassThru } | group Name -AsHashTable
$Names.MyName

【问题讨论】:

    标签: powershell group-object


    【解决方案1】:

    您无法通过道具名称或基于键的访问访问哈希表中的值的原因是键/道具包装在 PSObjects 中。在 Powershell Core 中有一个 Github issue 来解决此问题,但它可能会永远保留在 Windows Powershell 中。

    如果您想在分组后转换为哈希表,并希望通过属性名称或基于键的访问来访问某些分组值,请执行以下操作:

    $Names = 1..5 | ForEach-Object { 
        New-Object PsObject | Add-Member -Type ScriptProperty -Name Name -Value { return "MyName"} -PassThru 
    } | Group-Object -Property 'Name' -AsHashTable -AsString
    $Names.MyName 
    $Names['MyName'] 
    


    如果您想在分组后转换为哈希表,并希望一次访问所有分组的值,请执行以下操作:

    $Names = 1..5 | ForEach-Object { 
        New-Object PsObject | Add-Member -Type ScriptProperty -Name Name -Value { return "MyName"} -PassThru 
    } | Group-Object -Property 'Name' -AsHashTable
    $Names.Values
    


    如果您在分组后不转换为哈希表,并且想要访问$Names.Group 中的数据,则需要展开该属性。

    $Names = 1..5 | % { 
        new-object psobject | add-member -Type ScriptProperty -Name Name -Value {"MyName"} -PassThru 
    } | Group-Object -Property 'Name' 
    $Names | Select-Object -ExpandProperty Group
    

    【讨论】:

    • @xinglong,我编辑了答案,以便在使用 -AsHashTable 时解决方案有效。
    • 我知道 $Names.Values 有效,但由于它是哈希表,为什么 $Names.Keys 和 $Names.Values 有效,但 $Names["MyName"] 和 $Names.MyName 不t?
    • @xinglong,我添加了对密钥/道具访问问题的解释,以及允许您的示例基于密钥/道具访问的代码。如果您没有其他问题,请接受我的回答。
    猜你喜欢
    • 2011-03-12
    • 1970-01-01
    • 2021-07-04
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2021-04-03
    • 2023-04-07
    相关资源
    最近更新 更多