将 PSCustom 对象添加到数组
Adding PSCustom Object to an array
我正在使用双 for 循环来列出所有团队的频道及其类型,以便将它们导出为 CSV:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = @() # Final Report
foreach($team in $TeamsPool)
{
$TeamsChannel = @{} | Select Teams,Channel,Type
$TeamsChannel.Teams = $team.DisplayName
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
$TeamsChannel.Channel=$Channel.DisplayName
$TeamsChannel.Type=$Channel.MembershipType
$Report+=$TeamsChannel
}
}
该代码在具有单个通道的 Teams 上运行良好,但一旦有多个通道,该 Teams 的“$Report”中的所有值都会被最后一个值替换:
预期结果:
Teams
Channel
Type
Teams 1
General
Public
Teams 1
Public Channel 1
Public
Teams 2
General
Public
Teams 2
Public Channel 2
Public
Teams 2
Private Channel 2
Private
实际结果:
Teams
Channel
Type
Teams 1
Public Channel 1
Public
Teams 1
Public Channel 1
Public
Teams 2
Private Channel 2
Private
Teams 2
Private Channel 2
Private
Teams 2
Private Channel 2
Private
将 PSCustomObject 添加到 Arrays 时似乎有一个特殊的交互,但我一直无法找出是哪个。
您目前正在为每个团队 创建一个输出对象,而不是每个频道 - 所以您最终会覆盖点击最后一个频道时的前一个输出对象。
将您的代码更改为:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = @() # Final Report
foreach($team in $TeamsPool)
{
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
# Create new object per-channel
$TeamsChannel = @{} | Select Teams,Channel,Type
$TeamsChannel.Teams = $team.DisplayName
$TeamsChannel.Channel=$Channel.DisplayName
$TeamsChannel.Type=$Channel.MembershipType
$Report += $TeamsChannel
}
}
我个人的偏好是使用 [pscustomobject]
而不是 select
,并将整个循环表达式分配给 $Report
而不是 +=
:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = foreach($team in $TeamsPool)
{
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
# Create new object per-channel
[pscustomobject]@{
Teams = $team.DisplayName
Channel = $Channel.DisplayName
Type = $Channel.MembershipType
}
}
}
我正在使用双 for 循环来列出所有团队的频道及其类型,以便将它们导出为 CSV:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = @() # Final Report
foreach($team in $TeamsPool)
{
$TeamsChannel = @{} | Select Teams,Channel,Type
$TeamsChannel.Teams = $team.DisplayName
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
$TeamsChannel.Channel=$Channel.DisplayName
$TeamsChannel.Type=$Channel.MembershipType
$Report+=$TeamsChannel
}
}
该代码在具有单个通道的 Teams 上运行良好,但一旦有多个通道,该 Teams 的“$Report”中的所有值都会被最后一个值替换:
预期结果:
Teams | Channel | Type |
---|---|---|
Teams 1 | General | Public |
Teams 1 | Public Channel 1 | Public |
Teams 2 | General | Public |
Teams 2 | Public Channel 2 | Public |
Teams 2 | Private Channel 2 | Private |
实际结果:
Teams | Channel | Type |
---|---|---|
Teams 1 | Public Channel 1 | Public |
Teams 1 | Public Channel 1 | Public |
Teams 2 | Private Channel 2 | Private |
Teams 2 | Private Channel 2 | Private |
Teams 2 | Private Channel 2 | Private |
将 PSCustomObject 添加到 Arrays 时似乎有一个特殊的交互,但我一直无法找出是哪个。
您目前正在为每个团队 创建一个输出对象,而不是每个频道 - 所以您最终会覆盖点击最后一个频道时的前一个输出对象。
将您的代码更改为:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = @() # Final Report
foreach($team in $TeamsPool)
{
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
# Create new object per-channel
$TeamsChannel = @{} | Select Teams,Channel,Type
$TeamsChannel.Teams = $team.DisplayName
$TeamsChannel.Channel=$Channel.DisplayName
$TeamsChannel.Type=$Channel.MembershipType
$Report += $TeamsChannel
}
}
我个人的偏好是使用 [pscustomobject]
而不是 select
,并将整个循环表达式分配给 $Report
而不是 +=
:
$TeamsPool = Get-Team | Select DisplayName,GroupID # Existing Teams
$Report = foreach($team in $TeamsPool)
{
$teamschannels = Get-TeamChannel -GroupId $team.GroupID
foreach($Channel in $teamschannels)
{
# Create new object per-channel
[pscustomobject]@{
Teams = $team.DisplayName
Channel = $Channel.DisplayName
Type = $Channel.MembershipType
}
}
}