是否可以在powershell中向集合添加属性?

时间:2011-03-06 20:35:27

标签: collections powershell properties

我有一个非常大的对象数组,由正常的Get-ChildItem获得,我需要能够通过各种不同的属性对它们进行索引。我已经制作了一组哈希表,它们通过这些属性对它们进行索引,但是现在它只是一堆必须单独构建和管理的集合。有一次我突然想到将哈希表添加到基本集合中作为“ByPath”“ByGuid”等属性会很好。构建它的代码只会将我已经拥有的各个语句组合在一起: / p>

$items = Get-ChildItem -recurse blahblah
$items | Add-Member -membertype NoteProperty -name "ByGuid" -value (Get-ItemsByGuid)
$items | Add-Member -memberType NoteProperty -name "ByPath" -value (Get-ItemsByPath)
$items

不幸的是,虽然这不会执行,但它没有做任何事情。这些属性存在并且可以通过Get-Member查看,但是在查询时它们始终为null,而在之后设置时它们会抛出。

Property 'ByGuid' cannot be found on this object; make sure it exists and is settable. At line:1 char:14 + $items. <<<< ByGuid = $itemsByGuid + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyAssignmentException

谎言!

根据我的目的,是否有任何理由不应该这样做?或者是否有某些原因导致我收到奇怪的混合消息?

1 个答案:

答案 0 :(得分:7)

是的,这是可能的,你走在正确的轨道上。请记住,管道枚举了集合(包括数组)。您需要考虑该枚举,否则您最终会将属性添加到数组中的每个项目而不是数组本身。您可以使用逗号运算符来解决此枚举,如下所示:

$items = ,$items | Add-Member NoteProperty ByGuid (Get-ItemsByGuid) -PassThru
$items = ,$items | Add-Member NoteProperty ByPath (Get-ItemsByPath) -PassThru

请注意,如果要使用Get-Member检查$ items数组中的成员,则需要使用相同的技巧:

,$items | Get-Member

,运算符只是将目标包装在另一个目标是唯一元素的数组中。当管道枚举这个新数组时,我们将原始数组作为管道的唯一输出。