foreach过滤掉已经分开的成员

时间:2017-04-04 13:33:08

标签: powershell foreach

$GetGroupsFromUser = Get-ADPrincipalGroupMembership $WPFnamelookupbox.Text |
                     Where-Object { $_.Name -like 'G1*' }
$Groups = Get-ADGroup -Filter {Name -like "G1*"}

foreach ($G in $Groups) {
    if ($GetGroupsFromUser -contains $G) {
    } else {
        $WPFgroups.Items.Add($G.SamAccountName)
    }
}

我的目标是我只想显示用户不是其成员的群组。

所以我在-contains运算符上取得了一些进展。为了-contains能够工作,我需要先创建一个数组,对吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Compare-Object

$GetGroupsFromUser = Get-ADPrincipalGroupMembership $WPFnamelookupbox.Text | Where-Object {$_.name -like 'G1*' }
$Groups = Get-ADGroup -Filter "name -like 'G1*'"
Compare-Object $Groups $GetGroupsFromUser | Where-Object {$_.SideIndicator -eq "<="}

答案 1 :(得分:1)

当您尝试查找数组中元素的匹配项时,

-contains的功能最佳。

如果您只是在寻找与用户已经拥有的过滤器匹配的组,我们可以在where子句中使用-notcontains

$groupFilter = "G*"
$user = "user_bagel"
$allFilteredGroups = Get-ADGroup -Filter "name -like '$groupFilter'" | Select-Object -ExpandProperty name
$userFilteredGroups = Get-ADPrincipalGroupMembership $user | Where-object{$_.name -like $groupFilter} | Select-Object -ExpandProperty name
$allFilteredGroups | Where-Object{$userFilteredGroups -notcontains $_}

您不需要像我一样扩展群组名称。您将获得类似的结果。因为你只想知道名字,所以保留完整的组对象似乎很愚蠢。理论上它也会以这种方式表现得更快。设置$groupFilter之类的变量可以更轻松地对您的脚本进行更改。