【问题标题】:Backtick for Get-ADUser multi-line filter in PowerShellPowerShell 中 Get-ADUser 多行过滤器的反引号
【发布时间】:2017-08-17 16:47:54
【问题描述】:

我在 PowerShell 中通过 Get-AdUser 命令在多行过滤器表达式中使用反引号(重音符号)时遇到问题。具体来说,我正在 Windows 7 上测试 PowerShell 2.0。

一个工作示例(过滤器都在一行上):

Get-ADUser -Filter {Name -like "Smith*" -and Enabled -eq $True}
# This works as expected, a list of matching objects is returned on pipeline

一个破碎的例子(过滤器被分割成多行):

Get-ADUser -Filter {Name -like "Smith*" `
-and Enabled -eq $True}
# Error message indicates "Operator not supported at position [of backtick]

第二个破例(反引号前带有 -and 的多行过滤器):

Get-ADUser -Filter {Name -like "Smith*" -and `
Enabled -eq $True}
#Error message indicates "Syntax error at position [of backtick]"

请提供解决方法示例或解释不支持这些多行过滤器的原因。我无法弄清楚这一点,但似乎这应该是 PowerShell 中一种简单而常见的操作类型。

【问题讨论】:

    标签: powershell escaping multiline backticks


    【解决方案1】:

    我相信更有经验的人可以帮助解决这一问题,但 PowerShell 似乎没有为此行消耗反引号,因此它正在进入不喜欢它的 AD 过滤器解析器。我在about_ActiveDirectory_Filter 中没有找到任何可以准确解释这一点的内容。不过,反引号仍用于转义字符。很可能换行符正在传递给 AD 过滤器解析器,但它不喜欢它。

    我知道可行的解决方法是事先将您的脚本块构建成一个变量并将其传递给Get-Aduser

    $sb = {
        Name -like "Matt*" -and
        Enabled -eq $True
    }
    Get-ADUser -Filter $sb
    

    【讨论】:

    • 你好@Matt,这帮助我得到了一个可以接受的解决方法。不过,我不必创建单独的脚本块。只需用 - 结束每一行就足够了,这会让解析器继续寻找更多(我认为?)。它不会让我将多行代码放在评论中 - 试图找出将它放在哪里......
    【解决方案2】:

    发布受@Matt 回答启发的多行代码示例。只需用 -and (删除反引号)结束每一行就足够了。 -and 似乎让解析器继续寻找更多。这是基于他的回答的一个工作示例

    Get-ADUser -Filter {Name -like "Smith*" -and
    Enabled -eq $True}
    # Works as expected, drop backtick and end each line with -and (or similar)
    

    过滤器和脚本块解析器的奇怪行为,但这种解决方法对我来说是可以接受的。要确认这似乎只是与故障命令的 -Filter 选项有关,请参阅以下使用带有脚本块的直接 powershell 的示例(反引号多行转义有效)。

    & {1 -eq 1 `
    -and 2 -eq 2}
    # This works as expected, output is "True"
    

    【讨论】:

    • 我现在觉得很傻,因为这就是基本的 PowerShell 解析器的工作方式。令我惊讶的是,我从来没有想过只是省略反引号,因为大多数多行 cmets 通常不需要它。
    • 这在过去让我绊倒了,我不记得了,所以现在我们在 SO QA 帖子中永远拥有它;-)。谢谢你帮我解决这个问题!我相信下次 Google 会为我找到这篇文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多