将 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
        }
    }
}