PowerShell:如何通过where-object cmdlet应用多个过滤器?

时间:2018-02-14 14:14:29

标签: powershell

是否有更好的方法通过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")
}

3 个答案:

答案 0 :(得分:1)

直接在查询中过滤比使用Where-Object(首先检索所有对象)后事后过滤更有效。使用-LDAPFilter参数的示例:

Get-ADComputer -LDAPFilter "(&(!operatingSystem=Windows 7*)(!operatingSystem=Windows 10*))" -Properties operatingSystem,description

答案 1 :(得分:0)

$clients | Where OperatingSystem -notlike "*Windows 7*" |
    Where OperatingSystem -notlike "*Windows 10*"  

严格地说,这应该有用。

但是,您遇到的问题是上面显示的简化Where-Object语法仅适用于最简单的情况。使用完整语法时,必须使用$_变量指定属性:

$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

答案 2 :(得分:-1)

或许这样的事情?

$DesktopClients=@('Windows 7','Windows 10')
$Clients=$Clients -notmatch ($DesktopClients -join '|')