2014-07-21 87 views
1

Powershell中的「-contains」運算符需要完全匹配(無通配符)。 「 - 匹配」運算符允許通配符和部分匹配。如果我想對可能的匹配列表執行部分/通配符匹配,那麼我應該如何執行此操作?使用Powershell中的另一個列表在列表中搜索部分匹配

例如:

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

「走出去」將-match「回家」,但$ my_strings_list不會-contains「走出去」 現在我工作圍繞這通過循環,但它不」看起來應該是最好的方式:

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

我應該如何解決這個問題? 對於具體的任務,我實際上是爲所有匹配1個描述的用戶查詢一個大的AD數據庫。我希望它看起來儘可能整潔。我有類似的東西:

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

但它成爲過濾器字符串中可能匹配的一個可怕的長長的清單。然後我把所有東西都放到一個變量中,然後處理出我想要的實際匹配。但看起來我應該能夠以更少的線路完成任務。也許只有1長的正則表達式字符串,並將其放入過濾器?

|?{$_.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} 

我寧願更多的東西,如「獲取,等等等等| {$ _描述? $ my_match_list},因爲它更容易添加東西比把它們添加到一個正則表達式的列表。

+1

然後將它們添加到列表中,並轉換爲正則表達式。 '$ filter =「($($ ArrayOfStuff -join」|「))」'將@(「Bob」,「June」,「Michael」)'變成'「(Bob | June | Michael)」' – TheMadTechnician

+0

是天才。謝謝。 – BSAFH

回答

2
$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

相關問題