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