使用“-eq”在 cmdlet 中放置变量时出现问题

Problem placing a variable in a cmdlet with "-eq"

我正在尝试在 Exchange 2019 powershell 中做一些非常简单的事情,但对于我来说,我似乎无法理解简单的变量放置。该问题与 Exchange 无关,只是纯粹的 PS.

我需要执行cmdlet

New-AddressList "XX Users" -RecipientFilter {((CustomAttribute2 -eq "XX") -and (RecipientType -eq 'UserMailbox'))}

很好,但我想用变量替换 "XX Users" 和 "XX"。

我可以用

这样的话来代替"XX Users"
$var1 = "XX Users" (this actually works)
$var2 = "XX" (does not work)

所以我得到

New-AddressList $var1 -RecipientFilter {((CustomAttribute2 -eq $var2) -and (RecipientType -eq 'UserMailbox'))}

对于我来说 $var2 没有为 -eq 插入正确的值。我尝试了多种组合,包括使用单引号、双引号、where object、移动大括号,但我一无所获。它要么将其视为文字,要么将其视为 null。

-RecipientFilter parameter[string] 类型的,这意味着您传递的脚本块的 文字 内容 - 开头 [=13] 之间的所有内容=] 和结束 } - 作为值传递。

也就是说,没有变量引用的插值,例如$var2,所以除非New-AddressList本身通过访问调用者的变量主动执行该插值, $var2 将被使用 verbatim,这不是您的本意。

这听起来与 AD(Active Directory)过滤器的问题相同 - 请参阅 this answer(除了后者实际上 do 插值 simple 变量引用,但不是 表达式 ,例如 $var2.Name,这就是为什么最好不要依赖它。

与 AD 情况一样,最好的方法是将 -RecipientFilter 参数构造为 字符串 ,特别是 expandable string ("...") 你可以在其中嵌入变量 values:

# Construct the filter as an *expandable string*.
# Note that $var2 is instantly replaced by its value, so
# you still need quoting around it.
# The assumption is that $var2's value doesn't contain single quotes itself.
$filterString = "((CustomAttribute2 -eq '$var2') -and (RecipientType -eq 'UserMailbox'))"

New-AddressList $var1 -RecipientFilter $filterString

如果 $var2 可能包含 ' 个字符。本身,将 $var2 替换为 转义 这些表达式;如果 New-AddressList 期望与 PowerShell 本身相同的转义 - 即 doubling ' 个字符。 - 将 $var2 替换为 $($var2 -replace "'", "''").


奇怪的是,在撰写本文时,official help topic 积极推荐 { ... } 语法而没有说明其基本限制,并且所有示例命令仅显示带有文字的过滤器。 This GitHub issue 就是为了解决这个问题而创建的。