PowerShell:如何通过where object cmdlet应用多个筛选器?
是否有更好的方法通过PowerShell:如何通过where object cmdlet应用多个筛选器?,powershell,Powershell,是否有更好的方法通过where object过滤对象,然后通过多个管道发送数据 $clients = Get-ADComputer -SearchBase "OU=Clients,DC=contoso,DC=com" -Filter * -Properties Description,OperatingSystem $clients | Where OperatingSystem -notli
where object
过滤对象,然后通过多个管道发送数据
$clients = Get-ADComputer
-SearchBase "OU=Clients,DC=contoso,DC=com"
-Filter *
-Properties Description,OperatingSystem
$clients | Where OperatingSystem -notlike "*Windows 7*"
| Where OperatingSystem -notlike "*Windows 10*"
理想情况是一个复杂的过滤机制,就像我们可以用于-Filter
参数一样。我本来希望能够使用如下内容
$Clients | Where {
(OperatingSystem -notlike "Windows 7") -and (OperatingSystem -notlike "Windows 10")
}
也许是这样的
$DesktopClients=@('Windows 7','Windows 10')
$Clients=$Clients -notmatch ($DesktopClients -join '|')
直接在查询中过滤比使用
Where Object
(首先检索所有对象)在事实之后过滤更有效。使用-LDAPFilter
参数的示例:
Get-ADComputer -LDAPFilter "(&(!operatingSystem=Windows 7*)(!operatingSystem=Windows 10*))" -Properties operatingSystem,description
严格地说,这应该行得通
但是,您遇到的问题是,上面显示的简化的Where Object
语法只在最简单的情况下有效。使用完整语法时,必须使用$\uu
变量指定属性:
$clients | Where-Object {
($_.OperatingSystem -notlike '*Windows 7*') -and ($_.OperatingSystem -notlike '*Windows 10*')
}
但是,由于您使用的是Get-ADComputer
,因此确实应该在该命令上使用-Filter
属性。它将更快,并且对域控制器的工作也更少:
Get-ADComputer -SearchBase "OU=Clients,DC=contoso,DC=com" `
-Filter "(OperatingSystem -notlike '*Windows 7*') -and (OperatingSystem -notlike '*Windows 10*')" `
-Properties Description,OperatingSystem
(操作系统
->($\u0.OperatingSystem
,正如@PetSerAl指出的那样,您的问题在于正确访问属性。-在Where对象筛选器中工作良好。这在PowerShell常见问题解答中出现过很多次。Active Directory是一个数据库。您永远不会从SQL数据库检索所有表上的所有列,然后在应用程序内存中对其进行筛选。LDAP也一样。感谢您的回复。我知道网络和域控制器的负担。但我必须补充一点,我正在对数据进行进一步处理,需要的不仅仅是“Windows 7”对象……因此提取“所有”数据(注意-searchBase限制)是更好的方法。
Get-ADComputer -SearchBase "OU=Clients,DC=contoso,DC=com" `
-Filter "(OperatingSystem -notlike '*Windows 7*') -and (OperatingSystem -notlike '*Windows 10*')" `
-Properties Description,OperatingSystem