首页 > 解决方案 > PowerShell + Exchange Online - 使用 Where-Object 针对不同对象过滤一个对象?

问题描述

真的把我的头发拉出来了。我有点初学者所以提前道歉。

我在使用 Where-Object cmdlet 基本上从 Exchange Online 中的 Get-Group 查询中删除外部联系人时遇到问题。

group@domain.com包含 4 个成员 -InternalUser1, InternalUser2, ExternalUser1, ExternalUser2

这是我到目前为止所拥有的,并且我尝试了许多不同的比较器(-notmatch、-notlike、-ne 等)但无济于事:

输入

$x = Get-Contact | Select-Object -ExpandProperty Identity
$y = Get-Group -Identity "group@domain.com" | Select-Object -ExpandProperty Members | Where-Object {$_ -notcontains $x}

输出

$x
ExternalUser1
ExternalUser2

$y
ExternalUser1
ExternalUser2
InternalUser1
InternalUser2

期望的输出

$y
InternalUser1
InternalUser2

排除 Where-Object 部分,输出是正确的,因此问题必须出在我对 Where-Object cmdlet 的使用上。对此的任何帮助将不胜感激!

标签: powershelloffice365exchange-server

解决方案


假设您的扩展变量包含字符串列表,则以下工作。

 $y | Where-object {$_ -notin $x}

应用于您的示例

$x = Get-Contact | Select-Object -ExpandProperty Identity
$y = Get-Group -Identity "group@domain.com" | Select-Object -ExpandProperty Members | Where-Object {$_ -notin $x}

完整的可重现的独立示例。

$x = @(
'ExternalUser1',
'ExternalUser2'
)

$y = @(
'ExternalUser1',
'ExternalUser2',
'InternalUser1',
'InternalUser2'
)

$y | Where-object {$_ -notin $x}

如果这不起作用,请执行以下操作:

$x[0].GetType()
$Y[0].GetType()

如果 Member 或 Identity 是一个复杂对象而不是字符串,您可能需要在使用 -notin 之前从那里获取实际的字符串值


推荐阅读