Способ экспорта объектов с различными свойствами?
В последнее время я столкнулся с общей проблемой, связанной с написанием сценариев, и решил бросить ее в дикую природу, чтобы посмотреть, как другие люди справляются с этой проблемой.
ТЛ; др; Я хочу экспортировать объекты, которые имеют различное количество свойств. например; у объекта 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