我最近遇到了一个常见的问题,并决定把它放到野外,看看其他人是如何处理这个问题的。
tl; dr; 我想导出具有不同数量属性的对象。例如;对象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
的标题。
其他人怎么处理这个?
旁注;我考虑将我的第一个对象创建为具有大量对象(因此标题)的虚拟对象但很好 - 这并不酷,真的让我觉得效率低下。答案 0 :(得分:0)
你可以通过属性的数量来获得你想要的$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