【问题标题】:Problem placing a variable in a cmdlet with "-eq"使用“-eq”将变量放入 cmdlet 时出现问题
【发布时间】:2020-02-17 02:04:09
【问题描述】:

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

我需要执行 cmdlet

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

这很好,但我想用变量替换“XX 用户”和“XX”。

我可以通过说类似的话来替换“XX 用户”

$var1 = "XX Users" (this actually works)
$var2 = "XX" (does not work)

所以我明白了

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

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

【问题讨论】:

    标签: powershell parameter-passing exchange-server


    【解决方案1】:

    -RecipientFilter parameter[string]-typed,这意味着您传递的脚本块的 literal 内容 - 开头 { 和结尾 } 之间的所有内容 - 被传递作为一个值。

    也就是说,没有对变量引用(例如$var2)进行插值,因此除非New-AddressList 本身通过访问调用者的变量主动执行插值,否则将使用$var2 逐字逐句,这不是你的意图。

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

    在 AD 案例中,最好的方法是将您的 -RecipientFilter 参数构造为一个 字符串,特别是作为一个 expandable string ("..."),您可以在其中嵌入变量

    # 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 本身相同的转义 - 即 加倍 ' 字符。 - 将$var2 替换为$($var2 -replace "'", "''")


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

    【讨论】:

    • 我很高兴听到它有帮助,@NimaKamkar;我的荣幸。我发现官方文档积极推荐 { ... } 语法而没有提及其局限性,这让我感到莫名其妙。
    • 我很高兴,@NimaKamkar;感谢您的反馈 - 我们希望 GitHub 问题会触发文档更新。
    猜你喜欢
    • 2011-03-20
    • 2011-09-03
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-11-05
    相关资源
    最近更新 更多