使用“-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 就是为了解决这个问题而创建的。
我正在尝试在 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 就是为了解决这个问题而创建的。