尝试合并数据但似乎停止

Attempting to combine data but appears to stall

我使用了一个脚本来获取许可信息,效果很好。我想将组信息抓取到这个脚本中,这样我就可以看到一个人在哪个组中,同时还可以获得关于他们的其他信息,脚本的重要部分如下所示

$result = foreach($domain in $domains){
    $users = Get-MsolUser -all | where {$_.islicensed -eq "$true" -and $_.Userprincipalname -match "$domain"}
        foreach ($i in $users){
        
        $licenses = $i.Licenses
        $licenseArray = $licenses | foreach-Object {$_.AccountSkuId}
        $licensear = Friendlyname
        $licenseString = $licenseAr -join ", "
                    
    New-Object PSObject -Property @{

        Displayname = $i.Displayname
        Userprincipalname = $i.userprincipalname
        UPN = ($i.userprincipalname -Split '@')[1]
        Licenses = $licenseString

        }
    }
}

这没有问题,但显然,无法从 Get-MsolUser 获取组信息,这导致我使用 Get-MsolGroup 继续使用 MOnline 模块。因此,我添加了以下内容:

$Groups1 = foreach ($Group in (Get-MsolGroup -all)){ 
                   if (Get-MsolGroupMember -all -GroupObjectId $Group.ObjectId | where {$_.Emailaddress -eq $i.UserPrincipalName}) {$Group.Displayname}
           }

$groups2 = $Groups1 -join ", "

结合使用,我将其添加到 Groups = $groups2

的新对象区域

我 运行 进入这里是一个巨大的停顿,实际上什么也没做,当通过调试器测试它时,我可以看到 $groups1/2 正在抓取并输出,因为我'我期待,但它似乎停在我添加的那一行。

我期待的是完成它,这样当我 select-反对这些新对象时,groups 字段将填充 $groups2 数据,这不会发生。

究竟是什么导致了这种行为?

继续我的评论,我会先收集组和成员,然后在您的用户循环中引用该变量。

$groups = Get-MsolGroup -All

$groupsandmembers = $groups | ForEach-Object {
    [PSCustomObject]@{
        GroupName = $_.displayname
        Members   = Get-MsolGroupMember -All -GroupObjectId $_.objectid |
                        Select-Object -ExpandProperty emailaddress
    }
}

$result = foreach($domain in $domains){
    $users = Get-MsolUser -all | Where-Object {
        $_.islicensed -eq $true -and
        $_.Userprincipalname -match $domain
    }

    foreach ($i in $users){
    
        $licenses = $i.Licenses
        $licenseArray = $licenses.AccountSkuId
        $licensear = Friendlyname
        $licenseString = $licenseAr -join ", "
                
        [PSCustomObject]@{
            Displayname       = $i.Displayname
            Userprincipalname = $i.userprincipalname
            UPN               = ($i.userprincipalname -Split '@')[1]
            Licenses          = $licenseString
            Groups            = ($groupsandmembers | Where-Object members -contains $i.userprincipalname).groupname -join ', '
        }
    }
}