0

我最近在编写脚本时遇到了一个常见问题,并决定将其抛诸脑后,看看其他人如何处理这个问题。

tl;博士; 我想导出具有不同数量属性的对象。例如; 对象 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-csvout-file文件基于第一个对象生成了足够的标题时,它会根据第一个对象具有的属性数量创建标题。因此,假设第一个用户有 3 个匹配组,它将创建 header CtxGroup1, CtxGroup2, CtxGroup3。伟大的!不。

如果下一个用户有 5 个匹配组 - 只有前三个包含在输出中,另外 2 个被丢弃,因为我们没有CtxGroup4, CtxGroup5.

其他人到底是如何处理这个问题的?

边注; 我考虑将我的第一个对象创建为具有大量对象(以及标题)的虚拟对象,但是很好 - 这并不酷,而且真的让我感觉效率低下。

4

1 回答 1

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
于 2012-11-21T04:46:46.453 回答