PowerShell + Exchange Online - 使用 Where-Object 针对不同对象过滤一个对象?

PowerShell + Exchange Online - Using Where-Object to filter one object against different 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 的使用上。如有任何帮助,我们将不胜感激!

假设你的扩展变量包含一个字符串列表,下面的工作。

 $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

之前从那里获取实际的字符串值