如何使用Get-ADComputer过滤器获取所有部分匹配?

时间:2017-02-17 13:17:28

标签: powershell active-directory wildcard

我有以下PowerShell脚本

$server = Get-ADComputer -filter {name -like $computerhost}
write-host $server.name

它为我提供了包含$computerhost名称的ADComputer。

示例:

$computerhost = linuxserver

匹配计算机名称输出:" linuxserver01"

但如果计算机名称适合$computerhost,我实际上想要ADComputer。所以如果$ computerhost是" asdf"我想得到一台名为" a"或" as"或者" asd"或" asdf",但不是" asda"

示例:

$computerhost = linuxserver (new)

匹配计算机名输出:" linuxserver"

我不知道如何以这种方式使用通配符。

2 个答案:

答案 0 :(得分:2)

感谢您通过评论澄清。我想这可能就是你要找的东西:

Get-ADComputer -filter * | where-object { $computerhost -like "*$($_.name)*" }

例如(我在这里使用$ computers代替get-adcomputer):

$computers = 'a','as','asd','asdf','asda'
$computerhost = 'asdf'

$computers | where-object { $computerhost -like "*$_*" }

返回:

  

     

作为

     

ASD

     

ASDF

答案 1 :(得分:1)

如果您要查找与字符串$computerHost的部分匹配,则过滤器将无法处理,因为它未正确转换为LDAP查询。返回选择集中的所有计算机后,您必须处理该过滤器。如果您拥有大型计算机基础,则可以使用-SearchScope这样的参数来减少这种情况。最简单的方法是使用.contains()

Get-ADComputer -filter * | Where-Object{$computerhost.contains($_.name)}

需要小心,因为.contains()区分大小写。你可以做的一件事是强制你的字符串到同一个案例来删除该问题。

Where-Object{$computerhost.ToUpper().contains($_.name.toUpper())}

也可以使用-match operatore,请注意它支持正则表达式。这应该不是问题,但如果您的计算机名称有连字符,则需要对其进行转义。

Where-Object{$_.name -match $computerhost}