使用Powershell中的另一个列表在列表中搜索部分匹配项

时间:2014-07-21 22:36:07

标签: powershell

Powershell中的“-contains”运算符需要完全匹配(没有通配符)。 “-match”运算符允许使用通配符和部分匹配。如果我想为可能的匹配列表执行部分/通配符匹配,我应该怎么做?

例如:

$my_match_list = @("Going","Coming","Leaving","Entering")
$my_strings_list = @("Going home", "Coming over", "Leaving the house", "Entering a competition")

“Going”将匹配“回家”,但$ my_strings_list不会 - 包含“Going” 现在我通过循环来解决这个问题,但它看起来不应该是最好的方式:

foreach($i in $my_strings_list){
  foreach($y in $my_match_list){
   if($i -match $y){
    do.something
   }
  }
}

我该如何处理? 对于特定任务,我实际上是为所有匹配多个描述中的一个的用户查询大型AD数据库。我希望它看起来尽可能整洁。我有类似的东西:

$myVar = get-aduser -filter {blah -ne blah} -properties description | ?{$_.description -match "blah1" -or (etcetcetc)

但它成了过滤字符串中可能匹配的可怕长列表。然后我把所有东西都抓到变量中并处理出我想要的实际匹配。但看起来我仍然可以用更少的线来完成任务。也许只有一个长的正则表达式字符串并将其放入过滤器?

|?{$_.description -match "something|something|something|something"

编辑:正则表达式可能是我猜的最短:

$my_match_list = "going|coming|leaving|entering"
foreach($i in $my_strings_list){if($i -match $my_match_list){do.something}}

所以:

get-aduser -filter {blah -ne blah} -properties description | ?{$_.description -match $my_match_list}

我希望更喜欢“get-blah blah |?{$ _。$ my_match_list中的描述}”,因为它更容易将内容添加到列表而不是将它们添加到正则表达式。

1 个答案:

答案 0 :(得分:4)

$my_match_list = @("Going","Coming","Leaving","Entering")
$my_strings_list = @("Going home", "Coming over", "Leaving the house", "Entering a competition")

[regex]$Match_regex = ‘(‘ + (($my_match_list |foreach {[regex]::escape($_)}) –join “|”) + ‘)’

$my_strings_list -match $Match_regex

Going home
Coming over
Leaving the house
Entering a competition

http://blogs.technet.com/b/heyscriptingguy/archive/2011/02/18/speed-up-array-comparisons-in-powershell-with-a-runtime-regex.aspx