我正在尝试从Get-ADComputer
过滤/匹配操作系统,并且仅返回具有Windows 7及更高版本的计算机:
$computer = Get-ADComputer -properties OperatingSystem | Where-Object {operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*"} |
Where-Object {$_.name -like "*-*"} |
Where-Object {$_.name -NotLike "V7-*"} |
Where-Object {$_.name -NotLike "*-NONE"} |
Where-Object {$_.name -NotLike "*-ONCALL"} |
Where-Object {$_.name -NotLike "*-BLACKBAUD"} |
Where-Object {$_.name -NotLike "SC-WIN7-1"} |
Where-Object {$_.name -NotLike "UT-SWCLIENT-01"} |
Select-Object -Expand Name
但是当我这样做时,调试器会要求-Filter
参数
我也尝试过:
$computer = Get-ADComputer -properties OperatingSystem -filter {(operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*")} |
但是我收到了错误:
Get-ADComputer : Error parsing query: '(operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*")' Error Message: 'Operator Not supported: -match' at position: '18'.
那么正确/最好的方法是什么?
答案 0 :(得分:2)
使用Where-Object
进行高级过滤时,需要引用迭代器对象。同样在您的第一个代码示例中,包含-Filter *
以获取所有计算机的完整列表。即尝试运行
$computer = Get-ADComputer -properties OperatingSystem -Filter * `
| Where-Object {$_.operatingsystem -match "*Windows 7*|*Windows 8*|*Windows 10*"}
或者,您可以执行简单过滤并排除此{/ 1}} $_
运算符
Get-Process | where name -like svchost
但是,-match
运算符似乎不支持这种过滤方式。
您还可以在对所有AD计算机执行查询时过滤返回的结果,例如
Get-ADComputer -Properties OperatingSystem `
-Filter {OperatingSystem -like "*Windows 7*" -or OperatingSystem -like "*Windows 8*"}
有关对Active Directory执行高级筛选时允许的内容,请参阅此blog post。
在我看来,值得尝试在"服务器"尽可能多地进行过滤。查询结束,只返回您真正需要的内容。好处是所有进一步处理都会更快,因为要处理的数据更少。
答案 1 :(得分:1)
您正尝试在filters
cmdlet中使用多个Get-AdComputer
条件。我建议使用-match
参数,而不是使用-like
参数。我不确定Get-AdComputer
是否支持-match
参数。您可以执行以下操作 -
$computer = Get-ADComputer -properties OperatingSystem -filter 'operatingsystem -like "*Windows 7*" -or operatingsystem -like "*Windows 8*" -or operatingsystem -like "*Windows 10*"' |
如果您看到Get-Help Get-ADComputer -Examples
,则可以看到-filter
参数的使用方式。