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中的描述}”,因为它更容易将内容添加到列表而不是将它们添加到正则表达式。
答案 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