Exchange/Powershell - 将数据添加到新列而不是加入

Exchange/Powershell - Add data to new column rather than joining

我正在尝试将启用邮件的安全组中的用户列表导出到 csv,但希望将每个成员放在单独的列中,而不是加入现有列。

$Csvfile = "C:\SPOgroupmembers.csv"

$Groups = Get-DistributionGroup -Filter "Alias -like '*.spo'" -ResultSize Unlimited

$Groups | ForEach-Object {

    $GroupDN = $_.DistinguishedName
    $DisplayName = $_.DisplayName
    $PrimarySmtpAddress = $_.PrimarySmtpAddress
    $Members = Get-DistributionGroupMember $GroupDN -ResultSize Unlimited
   

    
    [PSCustomObject]@{
        DisplayName                        = $DisplayName
        PrimarySmtpAddress                 = $PrimarySmtpAddress
        Members                            = ($Members.Name -join ',')

    }


} | Sort-Object DisplayName | Export-CSV -Path $Csvfile -NoTypeInformation -Encoding UTF8 #-Delimiter ";"

这是它当前的输出方式:

DisplayName PrimarySmtpAddress Member
Test.SPO Test.SPO@test.com User1,User2,User3

这就是我想要实现的目标:

DisplayName PrimarySmtpAddress
Test.SPO Test.SPO@test.com User1 User2

我可能遗漏了一些简单的东西,但我们将不胜感激

动态构造 [pscustomobject] 的最简单方法 是首先构造一个有序的 hashtable - 这很容易迭代扩展 - 并将其转换为[pscustomobject] 完成后。

但是,在创建 CSV 输出的上下文中,您需要提前提交固定数量的属性(列) - 如果可行[1];例如:

$maxMembers = 10 # <- adjust this number to the max. count of members you expect

$Groups | ForEach-Object { ...

    # ...

    # Initialize an ordered hashtable with the static entries...
    $oht = [ordered] @{
        DisplayName                        = $DisplayName
        PrimarySmtpAddress                 = $PrimarySmtpAddress
    }
    # ... then iteratively add the Member1, Member2, ... entries
    foreach ($i in 1..$maxMembers) {
      $oht["Member$i"] = $Members[$i-1]
    }

    # Convert to a [pscustomobject] and output
    [pscustomobject] $oht

} | Sort-Object DisplayName | Export-CSV -Path $Csvfile -NoTypeInformation -Encoding UTF8

如果没有最大。可以/应该假设成员计数,考虑通过使用单个成员列结合为每个成员创建单独的行来对数据进行非规范化,如所示,这无疑是后续更好的方法数据的 程序化处理 与您正在寻找的 multi-column 方法相比,对于 人类观察者 来说,后者可能更容易掌握。


[1]也就是说,你需要知道一个群组最多可以有多少成员。您甚至可以尝试提前以编程方式确定该计数,但无论哪种方式,结果数字都可能太大而不实用。

如果你想导出每个成员都有自己的行的数据,在我看来,这是正确的方法,你可以有一个内部循环来为每个成员创建一个新的 pscustomobject群组成员:

Get-DistributionGroup -Filter "Alias -like '*.spo'" -ResultSize Unlimited | ForEach-Object {
    foreach($member in Get-DistributionGroupMember $_.DistinguishedName -ResultSize Unlimited) {
        [PSCustomObject]@{
            DisplayName        = $_.DisplayName
            PrimarySmtpAddress = $_.PrimarySmtpAddress
            Member             = $member
        }
    }
} | Sort-Object DisplayName | Export-CSV -Path ....