Powershell 将PSCustom对象添加到数组
我使用双for循环来列出所有团队的频道及其类型,以便将它们导出到CSV中: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
$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
,以便在所有循环完成后捕获。