如何将变量传递给 -Filter

How to pass a variable to -Filter

我在PS遇到了一个很奇怪的情况。

在我的脚本中,有一个 cmdlet (Get-Mailbox) 可以拉回一些邮箱并将它们存储在 $mailboxes.

然后我按如下方式循环查找匹配的 AD 帐户。

foreach ($user in $mailboxes) {
    Get-ADUser -Filter {UserPrincipalName -eq $user.UserPrincipalName}
}

当我 运行 时,它会出错,提示无法在 $user.

上找到 属性 UserPrincipalName

我已经调试并彻底测试了脚本。如果我输入 $user.UserPrincipalName 它会出错,它会输出一个 UPN 列表并且它们的日期类型是字符串,所以 属性 在那里并且有数据。

我得出的结论是,出于某种原因 -Filter 看不到 $user 变量 - 好像它被隔离在 {} 括号内,我听说可能是这种情况职能。但是,如果我像这样修改代码,它就可以工作。

foreach ($user in $mailboxes) {
    $name = $user.UserPrincipalName
    Get-ADUser -Filter {UserPrincipalName -eq $name}
}

虽然这解决了我的问题,但我想了解为什么第一个示例不起作用。谁能解释一下?

值得注意的是 get-mailbox 实际上首先连接到 Exchange Online 并且 returns 数据类型为:

Deserialized.Microsoft.Exchange.Data.Directory.Management.Mailbox

但是当 Get-ADUser 命令出错时,它说对象的类型是 PSCustomobject。我认为这可能是问题的一部分。

Get-ADUser -Filter "userprincipalname -eq '$($user.userprincipalname)'"

我不知道为什么,但这里有更多讨论关于哪些语法适用于 Get-ADUser,哪些不适用于 Get-ADUser,以及您使用的脚本块语法如何适用于完整的用户对象,但不适用于PSCustomObject,此处:

http://www.powershellish.com/blog/2015-11-17-ad-filter