2

有人可以帮助我正确引用吗,我需要 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*"'
4

1 回答 1

2

您需要用单引号包裹内部过滤器字符串:

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

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


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

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

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

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

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

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


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

于 2021-09-02T19:51:22.453 回答