您有语法问题:
' Where-Object
s(位置隐含)-FilterScript
参数需要一个脚本块参数{ ... }
——而不是带括号的表达式((...)
)。[1]
所以:
# Note the { ... } around the expression passed to Where-Object
Get-ADUser -Filter * -Properties physicalDeliveryOfficeName |
Where-Object { $_.physicalDeliveryOfficeName -eq "NICE" } # | ...
注意:由于"NICE"
是文字字符串而不是通配符模式,因此我使用了-eq
而不是-like
运算符。如果您确实需要将 find"NICE"
作为子字符串,请使用类似-like "*NICE*"
or 的内容,以便区分大小写匹配-clike "*NICE*"
,正如Mathias R. Jessen所建议的那样。
请注意,您也可以使用简化的语法,这样就不需要脚本块并允许使用单个参数(还要注意没有$_.
,这是隐含的):
Get-ADUser -Filter * -Properties physicalDeliveryOfficeName |
Where-Object physicalDeliveryOfficeName -eq "NICE" # | ...
退后一步:
Santiago Squarzon建议在源头执行过滤,使用's或参数Get-ADUser
-Filter
-LDAPFilter
,这样效率更高;例如:
Get-ADUser -Filter 'physicalDeliveryOfficeName -eq "NICE"'
顺便说一句:有许多示例使用带有-Filter
( -Filter { ... }
) 的脚本块语法,但-Filter
参数接受一个字符串,并且该字符串,即使它支持类似 PowerShell的语法,也由 AD 提供程序解释,所以最好传递一个字符串开头 - 有关更多信息,请参阅此答案。
[1] 如果使用(...)
,则表达式的值将绑定到-Property
参数,因此被解释为属性名称,其值(假设这样的属性甚至存在)被解释为布尔值,用于确定手头的输入对象是否应该是过滤或不过滤。如果表达式不计算为输入对象上存在的属性的名称,$false
则为隐含的,并且输入对象被过滤掉。在您的情况下,这可以预见地导致没有对象被过滤,因此没有输出。