我正在尝试筛选Active Directory中某个属性的值。
我试过了:
Get-ADUser -filter * -Properties physicalDeliveryOfficeName | Where-Object (($_.physicalDeliveryOfficeName -like "NICE")) | Select-Object physicalDeliveryOfficeName, name
Get-ADUser -filter * -Properties physicalDeliveryOfficeName | Select-Object physicalDeliveryOfficeName, name | Where-Object (($_.physicalDeliveryOfficeName -like "NICE"))
我没有得到任何错误,但也没有结果。
我搜索了所有physicaldeliverofficename
为(myvalue(的用户。我想显示姓名和办公室。
您有一个语法问题:
Where-Object
的(位置隐含的(-FilterScript
参数需要脚本块参数-{ ... }
-而不是带括号的表达式((...)
([1]
因此:
# Note the { ... } around the expression passed to Where-Object
Get-ADUser -Filter * -Properties physicalDeliveryOfficeName |
Where-Object { $_.physicalDeliveryOfficeName -eq "NICE" } # | ...
注意:由于"NICE"
是文字字符串,而不是通配符模式,因此我使用了-eq
而不是-like
运算符。如果您确实需要找到"NICE"
作为子字符串,请使用类似-like "*NICE*"
的东西,或者,对于区分大小写的匹配,使用-clike "*NICE*"
,正如Mathias R.Jessen所建议的那样
请注意,您也可以使用简化的语法,这消除了对脚本块的需要,并允许使用单独的参数(也请注意,没有$_.
,这是隐含的(:
Get-ADUser -Filter * -Properties physicalDeliveryOfficeName |
Where-Object physicalDeliveryOfficeName -eq "NICE" # | ...
后退一步:
Santiago Squarzon建议使用Get-ADUser
的-Filter
或-LDAPFilter
参数在源处执行过滤,这比效率高得多;例如:
Get-ADUser -Filter 'physicalDeliveryOfficeName -eq "NICE"'
顺便说一句:有很多例子将脚本块语法与-Filter
(-Filter { ... }
(一起使用,但-Filter
参数接受字符串,并且该字符串即使支持类似于的PowerShell-语法,也会由AD提供程序解释,因此最好先传递一个字符串-有关详细信息,请参阅此答案。
[1]如果使用(...)
,表达式的值将绑定到-Property
参数,因此被解释为属性名,其值(假设存在这样的属性(被解释为布尔值,用于确定是否应过滤手头的输入对象。如果表达式的计算结果不是输入对象上存在的属性的名称,则隐含$false
,并将输入对象过滤掉。在您的情况下,可以预见,这会导致没有对象被过滤,因此没有输出
Select-Object
cmdlet用于从较大的对象或列表中仅选择所需的列。
例如:
C:gitCore> gsv Spooler | fl
Name : Spooler
DisplayName : Print Spooler
Status : Running
DependentServices : {Fax}
ServicesDependedOn : {RPCSS, http}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
ServiceType : Win32OwnProcess, InteractiveProcess
GetService返回具有大量属性的服务对象。如果我只想要某些,我会这样使用:
C:gitCore> gsv Spooler | Select Name,Status
Name : Spooler
Status : Running
您正在使用cmdlet,可能会丢弃具有所需值的列。再次运行one-liner并删除Select-Object
cmdlet以查看所有可用列,直到找到属于Office的列为止。