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 ....
我正在尝试将启用邮件的安全组中的用户列表导出到 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
如果没有最大。可以/应该假设成员计数,考虑通过使用单个成员列结合为每个成员创建单独的行来对数据进行非规范化,如
[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 ....