Можно ли добавить свойства в коллекции в powershell? - PullRequest
2 голосов
/ 06 марта 2011

У меня есть очень большой массив объектов, полученных обычным Get-ChildItem, и мне нужно иметь возможность индексировать их по множеству различных свойств. У меня есть набор хеш-таблиц, которые я сделал, чтобы индексировать их по этим свойствам, но сейчас это просто набор коллекций, которые должны создаваться и управляться отдельно. В какой-то момент мне пришло в голову, что было бы неплохо просто добавить хеш-таблицы в базовую коллекцию в качестве свойств, таких как «ByPath», «ByGuid» и т. Д. Код для его построения просто собрал бы отдельные операторы, которые у меня уже есть:

$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, но они всегда равны нулю при запросе и выбрасываются при последующей установке.

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 Ответ

7 голосов
/ 07 марта 2011

Да, это возможно, и вы на правильном пути. Просто помните, что конвейер перечисляет коллекции (включая массивы). Вы должны учитывать это перечисление, иначе вы добавите свойства к каждому элементу в массиве, а не к самому массиву. Вы можете обойти это перечисление, используя оператор запятой следующим образом:

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

Обратите внимание, что если вы хотите проверить элементы в массиве $ items с помощью Get-Member, вам нужно использовать тот же трюк:

,$items | Get-Member

Оператор , просто помещает цель в другой массив, где цель является единственным элементом. Когда конвейер перечисляет этот новый массив, мы получаем исходный массив как единственный вывод в конвейер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...