【问题标题】:Using Variables in Powershell Get-ADUser -Filter在 Powershell Get-ADUser -Filter 中使用变量
【发布时间】:2021-09-02 19:33:49
【问题描述】:

有人可以帮助我正确引用吗,我需要 Get-ADUser -Filter 搜索中名字和姓氏的变量旁边的通配符

我认为我需要转义单引号但无法成功返回。

$LastADname = John
$FistADname = Doe
Get-ADUser -Filter "Name -like `*$LastADname`*$FirstADname`*"

Returns: Get-ADUser : Error parsing query: 'Name -like *Doe*John*' Error Message: 'syntax error' at position 12

这让我知道它确实解析了变量,但没有解析 *.如果我将所有内容用单引号括起来以对变量和 * 进行双引号,则它不会解析变量。如下所示

$LastADname = John
$FistADname = Doe
Get-ADUser -Filter 'Name -like "*$LastADname*$FirstADname*"'

我相信这是因为上述解决了但没有产生价值。当我用 var 替换文本时,它会产生结果

Get-ADUser -Filter 'Name -like "*Doe*John*"'

【问题讨论】:

  • "Name -like '*$LastADname*$FirstADname*'" 应该可以正常工作

标签: powershell variables get-aduser


【解决方案1】:

您需要用单引号将内部过滤器字符串括起来:

Get-ADUser -Filter "Name -like '*$LastADname*$FirstADname*'"

您不需要 ` 来转义 * 字符。用单引号 ' 包裹外部字符串的第二次尝试不起作用,因为单引号字符串是按字面呈现的。双引号 " 字符串允许您扩展变量,使用带有 ` 的转义序列,并在字符串中返回子表达式。


但是,如果目标字段值包含 '(或者可能包含,如果由变量控制),例如名称为 O'Niel,这将中断内部查询,因为 ' 将被解析为搜索词的结尾并会导致错误,因为接下来的内容几乎肯定不是有效的表达式语法。幸运的是,转义引号很容易,您无需担心使用` 字符转义。

考虑以下示例,我们要在其中查找名称字段包含O' 字符串的所有用户,就像上面的O'Niel 示例一样。在这个例子中,搜索词带有一个变量,就像在 OP 的用例中一样。只需对-Filter 字符串使用双引号,并为内部引号提供""(这与`" 呈现相同):

$term = "O'Niel"
Get-ADUser -Filter "Name -like ""*$term*"""

这不会破坏内部查询,因为现在 " 表示术语边界而不是 '

注意:如果您的搜索词包含",则需要转义。如果您的搜索词包含both '",则不能使用 -Filter 搜索该特定词。但是,您可以为此使用 -LDAPFilter,因为引号不用作搜索词范围。

当您搜索返回 DistinguishedName 的字段时,事情会得到 bit more complicated,但我不会用这些细节来混淆这个答案。阅读上面的链接以获取更多信息,我最终将在底部更新我的链接答案,提供有关转义序列和 DN/CN 过滤的更多信息。


请参阅我写的this answer,了解有关在 RSAT AD cmdlet 中有效使用-Filter 参数的更多信息。我已经更新了该答案,提供了有关过滤器转义和处理“带引号的名称”案例的更完整信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多