【问题标题】:Get-AdUser giving me a operator not supported errorGet-AdUser 给我一个操作员不支持的错误
【发布时间】:2019-11-01 09:18:09
【问题描述】:

尝试从使用 Get-AdUser 生成的对象的属性中查找用户的电子邮件

Get-ADUser -Filter {EmailAddress -eq $userobject.GivenName + '.' + $userobject.SurName + '@overflow.com'}

Get-ADUser:解析查询时出错:'EmailAddress -eq $userobject.GivenName + '.' + $userobject.SurName + '@nfiindustries.com'' 错误消息:'不支持运营商:' 位置:'40'。在行:1 字符:1 + Get-ADUser -Filter {EmailAddress -eq $userobject.GivenName + '.' + $u ...

【问题讨论】:

  • 在使用之前在-eq 左侧构建东西 - 然后使用它所在的 $Var 而不是您现在使用的复杂对象。 ///// 同样,Get-ADUser 命令对-Filter 参数使用字符串[不是脚本块]。如果您使用字符串而不是经常显示的 [但非常] 错误的脚本块,您将获得更好、最一致的结果。

标签: powershell active-directory


【解决方案1】:

要在尝试时创建内联过滤器,您需要使用子表达式运算符$()。这将允许 PowerShell 在将其传递给-Filter 参数之前处理内部的所有内容。

Get-ADUser -Filter "EmailAddress -eq '$($userobject.GivenName + '.' + $userobject.SurName + '@overflow.com')'"

最终,一旦 PowerShell 执行其变量扩展和字符串插值,过滤器预期为 Property -operator 'Value'Property -operator "Value"。达到这种状态的方式可能会有所不同。

正如Tomalak's answer 提到的,-Filter 参数接受字符串值而不是脚本块。为什么命令创建者将 ({}) 列为文档中的首选语法是一个谜。由于它接受一个字符串并且您很少希望字符串中的内容是文字,因此最好用双引号将过滤器括起来。然后在里面使用单引号。有时,复杂的过滤器会混合使用单引号和双引号,但您只需要注意一个开头引号会发现无意的结尾引号。甚至需要多组引号的原因是因为-Filter 包含比较运算符,这些运算符期望这些运算符的右侧被引用。如果您不混合引用类型,则必须想出更多创造性的方法来绕过插值。有关此行为的一些示例,请参见下文。请注意,Double Quotes outside while Escaping...Double Quotes Outside 和 Single Quotes Inside 场景使-Filter 收到它想要的内容。字符串外的单引号将不允许变量扩展($str 将只是字面上的 $str)。

双引号:

PS> "string with double quotes"
string with double quotes

单引号:

PS> 'single quotes'
single quotes

外加双引号,内加单引号:

PS> "outside doubles 'inside singles'"
outside doubles 'inside singles'

内外双引号:

PS> "double "double quotes""
At line:1 char:10
+ "double "double quotes""
+          ~~~~~~
Unexpected token 'double' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken
With all that said, it is just more readable to do your string building outside of the filter first.

外加单引号,内加双引号:

PS> 'outside singles "inside doubles"'
outside singles "inside doubles"

外部双引号,内部单引号变量:

PS> $str = "variable string"
PS> "outside doubles single variable '$str'"
outside doubles single variable 'variable string'

单引号外,内双引号变量:

PS> 'outside singles double variable "$str"'
outside singles double variable "$str"

外部双引号,内部转义双引号:

PS> "fancy escaping with variable ""$str"""
fancy escaping with variable "variable string"

PS> "fancy escaping with variable `"$str`""
fancy escaping with variable "variable string"

【讨论】:

    【解决方案2】:

    -Filter 值的行为更像是一个字符串,尽管它非常努力地看起来像一个包含所有花括号和 Powershell 样式运算符的脚本块,但它不是一个脚本块。因此,在普通 PowerShell 脚本代码中可以使用的大多数语法对于过滤器都是无效的。

    最好将其视为字符串。预先计算您想要过滤的任何值,这使得一切都更容易处理。

    $email =  $userobject.GivenName + '.' + $userobject.SurName + '@overflow.com'
    
    Get-ADuser -Filter "EmailAddress -eq $email"
    

    【讨论】:

      猜你喜欢
      • 2021-01-21
      • 2017-03-30
      • 1970-01-01
      • 2014-03-10
      • 2021-07-21
      • 1970-01-01
      • 2021-10-01
      • 2021-12-23
      • 2015-02-16
      相关资源
      最近更新 更多