Способ экспорта объектов с различными свойствами?

В последнее время я столкнулся с общей проблемой, связанной с написанием сценариев, и решил бросить ее в дикую природу, чтобы посмотреть, как другие люди справляются с этой проблемой.

ТЛ; др; Я хочу экспортировать объекты, которые имеют различное количество свойств. например; у объекта 1 может быть 3 IP-адреса, а у объекта 2 - 7 IP-адресов.

Я разработал создание нового объекта с настраиваемыми свойствами, а затем внедрил эти объекты в массив в качестве метода сбора результатов - рад слышать, что есть лучший способ, но я так и делаю. Этот метод работает на 100% при выводе на экран, поскольку объекты отображаются в виде списка - я пробовал несколько методов экспорта / вывода из файла, но безрезультатно, когда я хочу захватить и сохранить выходные данные для чтения в чем-то вроде Excell,

Ниже приведен пример того, как я строю и храню объект (функция кода здесь не важна - только результаты, которые он генерирует):

add-pssnapin Quest.ActiveRoles.ADManagement
$Groups = get-qadgroup AmbigousGroupNameHere-
$UserInfo = @()

ForEach ( $Group in $Groups ) {
    $CurrentGroupMembers = get-qadgroupmember $Group
    write-host "Processing group:" $Group
    ForEach ( $GroupMember in $CurrentGroupMembers ) {
        If ( $GroupMember.type -eq "User" ) {
            $counter = 1
            write-host "Processing member:" $GroupMember
            $UserObject = get-qaduser $GroupMember | select SamAccountName,FirstName,LastName

            $objUserInfo = New-Object System.Object
            $objUserInfo | Add-Member -MemberType NoteProperty -Name SamAccountName -Value $UserObject.SamAccountName
            $objUserInfo | Add-Member -MemberType NoteProperty -Name FirstName -Value $UserObject.FirstName
            $objUserInfo | Add-Member -MemberType NoteProperty -Name LastName -Value $UserObject.LastName

            $GroupMembership = get-qadgroup -ContainsMember $GroupMember | where name -like "AmbigousGroupNameHere-*"

            ForEach ( $GroupName in $GroupMembership ) {
                $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName
                $counter++
            }
            $UserInfo += $objUserInfo
        } else {
            write-host "This is a group - we are ignoring it."
        }
    }
}

$UserInfo | Export-Csv UsersOutput.csv -NoType

Из приведенного выше - вы можете видеть, как я масштабирую имя свойства объекта на 1 для каждой группы. CtxGroup$counter позволяет мне масштабировать объект для правильного количества групп, которые есть у каждого пользователя. Подтвердил, что это прекрасно работает при выводе на экран по умолчанию. Объект указан в списке, и я вижу новое свойство для каждой группы, которое соответствует этому пользователю.

Теперь о проблеме. Когда я export-csv или же out-file файл генерируется с достаточным количеством заголовков на основе первого объекта - поэтому он создает заголовки на основе количества свойств, которые имеет первый объект. Допустим, у первого пользователя есть 3 подходящие группы, он создаст заголовок CtxGroup1, CtxGroup2, CtxGroup3, Большой! Нет.

Если у следующего пользователя 5 совпадающих групп - только первые три включаются в вывод, а дополнительные 2 отбрасываются, поскольку у нас нет заголовков для CtxGroup4, CtxGroup5,

Как же другие люди справляются с этим?

Примечание; Я рассматривал создание своего первого объекта в качестве манекена с огромным количеством объектов (и, следовательно, заголовков), но хорошо - это не круто и действительно заставляет меня чувствовать себя неэффективно.

1 ответ

Решение

Вы можете получить то, что вы хотите заказать $UserInfo массив по количеству свойств, это можно сделать, но это не так просто, в вашем случае я бы добавил еще одно свойство с добавленным количеством групп:

...
ForEach ( $GroupName in $GroupMembership ) {
                $objUserInfo | Add-Member -MemberType NoteProperty -Name CtxGroup$counter -Value $GroupName.SamAccountName
                $counter++
            }
$objUserInfo | Add-Member -MemberType NoteProperty -Name NbCtxGroup -Value ($counter - 1)
$UserInfo += $objUserInfo
...

А затем упорядочить по убыванию массив по этой свойства:

$UserInfo | Sort-Object -Property NbCtxGroup -Descending | Export-Csv .\F.csv

Это не так приятно, но сработает.

Посмотри на:

$objUserInfo.psobject.Properties | Measure-Object
Другие вопросы по тегам