Полезный ответ LotPings предоставляет эффективные решения.
Что касается что вы пытались :
Путем построения только одного [pscustomobject]
экземпляра вне цикла :
$DLGP = "" | Select "Name","Grade","Score"
, а затем обновлять только свойства этого экземпляра в каждой итерации цикла:
$DLGP.Name=$record.name
# ....
вы эффективно добавляли один и тот же экземпляр [pscustomobject]
несколько раз в массив результатов вместо создания отдельного объекта в каждой итерации.
Поскольку один и тот же объект неоднократно обновлялся, этот объект в конечном итоге имел свойства last объекта во входной коллекции, $data
.
В сторону:
[PSCustomObject] @()
фактически совпадает с @()
: [PSCustomObject]
игнорируется и вы получаете массив [object[]]
.
Чтобы ввести массив как экземпляр, содержащий [PSCustomObject]
экземпляров, вам нужно будет использовать array -тип-приведение: [PSCustomObject[]] @()
.
Однако, учитывая, что экземпляры любого типа могут быть преобразованы в [PSCustomObject]
- что на самом деле совпадает с [psobject]
- это не обеспечивает безопасность типов и не повышает производительность.
Кроме того, поскольку ваша $rec
переменная не ограничена по типу (она определяется как $rec = [<type>] ...
, а не [<type>] $rec = ...
), и вы используете +=
, чтобы «добавить» в массив (что неизменно требует создание нового экземпляра за кулисами), $rec
вернется к массиву [object[]]
после первой операции +=
.