您有语法问题:
' Where-Objects(位置隐含)-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则为隐含的,并且输入对象被过滤掉。在您的情况下,这可以预见地导致没有对象被过滤,因此没有输出。