Powershell 将PSCustom对象添加到数组

Powershell 将PSCustom对象添加到数组,powershell,microsoft-teams,Powershell,Microsoft Teams,我使用双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

我使用双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
    }
}
代码在具有单个通道的团队中运行良好,但一旦有多个通道,该团队的“$Report”中的所有值都将替换为最后一个值:

预期结果:

团队 频道 类型 第一队 一般的 公开的 第一队 公共频道1 公开的 第2队 一般的 公开的 第2队 公共频道2 公开的 第2队 专用频道2 私有的
您当前正在为每个团队而不是每个通道创建一个输出对象-因此,当您点击最后一个通道时,您将覆盖上一个输出对象的详细信息

将代码更改为:

$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]
而不是
选择
,并将整个循环表达式指定给
$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
        }
    }
}

您当前正在为每个团队而不是每个通道创建一个输出对象-因此,当您点击最后一个通道时,您将覆盖上一个输出对象的详细信息

将代码更改为:

$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]
而不是
选择
,并将整个循环表达式指定给
$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
        }
    }
}

在内部循环中构建一个
[PSCustomObject]
,而不是一部分在外部,一部分在内部。此外,在阵列上使用
+=
会随着阵列的增长而变慢。只需将输出循环分配给
$Report
,跳过定义空白的
$Report
,并从内部循环发送
PSCO
,以便在所有循环完成后捕获。在内部循环中构建
[PSCustomObject]
,而不是外部部分和内部部分。此外,在阵列上使用
+=
会随着阵列的增长而变慢。只需将输出循环分配给
$Report
,跳过定义空白的
$Report
,并从内部循环发送
PSCO
,以便在所有循环完成后捕获。