Get-AdUser给我一个操作员不支持的错误

时间:2019-06-18 17:10:24

标签: powershell active-directory

尝试从使用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行:char:1   + Get-ADUser -Filter {EmailAddress -eq $ userobject.GivenName +'。 + $ u ...

2 个答案:

答案 0 :(得分:1)

-Filter的行为更像是一个字符串,即使使用所有花括号和Powershell样式的运算符很难使它看起来像一个脚本块,它也不是一个脚本块。因此,大多数适用于常规PowerShell脚本代码的语法对于过滤器都是无效的。

最好将其视为字符串。预先计算要过滤的任何值,这使所有操作都变得更加容易。

$email =  $userobject.GivenName + '.' + $userobject.SurName + '@overflow.com'

Get-ADuser -Filter "EmailAddress -eq $email"

答案 1 :(得分: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包含比较运算符,这些运算符期望这些运算符的右侧被加引号。如果您不混合使用引号类型,那么您将不得不想出更多创造性的方法来绕过插值。有关此行为的一些示例,请参见下文。请注意,在转义时使用外部双引号... 在外部使用双引号和在内部使用单引号方案是使-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"