2016-03-04 180 views
1

我試圖避免使用嵌套的ForEach循環作爲更大的代碼的一部分。爲此,我使用-notcontains操作符。基本上,我想查看一個字符串內是否存在一個子字符串。如果存在,則不執行任何操作,如果不存在,則打印「未找到」。使用-notcontains查找字符串內的字符串中的子字符串

這裏是代碼...

$arr = @('"value11","value21","value31"','"value12","value22","value32"','"value13","value23","value33"') 

if ($arr -notcontains "*`"value24`"*") 
{ 
    Write-Host "Not Found" 
} 

if ($arr -notcontains "*`"value22`"*") 
{ 
    Write-Host "Not Found 2" 
} 

我們可以看到,value24不是陣列的任何字符串中。但是,value22在數組中的第二個字符串內。

爲此結果應輸出隨後...

Not Found 

但是,相反,我看到下面的輸出...

Not Found 
Not Found 2 

誰能告訴我爲什麼發生這種情況?

+0

FYI,看起來像包含操作者需要在陣列中的項目的精確匹配,和通配符是無用 - http://www.computerperformance.co.uk/powershell/powershell_conditional_operators.htm。我有一個醞釀的答案,它絕對不是最乾淨的解決方案。如果有人有更好的解決方案,我很樂意聽到它。 –

+0

你想對每個匹配/不匹配做出反應嗎?或者只是在數組期間出現? – Matt

+0

基本上,如果子串不存在於數組的任何字符串中,它應該只打印一次「Not Found」。如果它確實存在於陣列中,請不要打印任何東西... –

回答

2

我採取的一個解決方案:

($arr | foreach {$_.contains('"value24"')}) -contains $true 

使用V3 .foreach()方法:

($arr.ForEach({$_.contains('"value24"')}).contains($true)) 

還有另一種可能性:

[bool]($arr.where({$_.contains('"value24"')})) 
+0

我認爲同樣的事情,但看起來更接近,它是一個(混亂的)字符串數組,其中字符串是單引號,然後包含看起來像雙引號字符串數組的內容。除非它太令人困惑,我也讀錯了。 – briantist

+0

你說得對。它實際上是更多的子字符串搜索。但解決方案似乎仍然有效。 – mjolinor

+0

啊完美。我只需要將'-contains'改爲'-notcontains'。但這正是我正在尋找的...感謝:D –

3

-contains-notcontains不針對模式進行操作。

幸運的是,-match-like和它們的負同行,與左側的陣列一起使用時,返回滿足條件的項目的數組:

'apple','ape','vape' -like '*ape' 

返回:

ape 
vape 

if聲明中,這仍然有效(0計數結果將被解釋爲$false):

$arr = @('"value11","value21","value31"','"value12","value22","value32"','"value13","value23","value33"') 

if ($arr -notlike "*`"value24`"*") 
{ 
    Write-Host "Not Found" 
} 
+0

那麼我的答案就會出現:) – Matt

+0

@Matt哈哈,你通常會打敗我,我認爲 – briantist

+0

這個問題,如果你改變'value24'如果聲明爲'value22',它仍然會說''Not Found''。我相信使用-like或-match不會單獨檢查每個項目。看到我的複雜答案,以獲得正確的結果... –

0

編輯更清晰的答案是什麼我正在尋找...

這是我能夠這麼遠想出解決辦法的唯一途徑。我希望有一個更清潔的解決方案......

$arr = @('"value11","value21","value31"','"value12","value22","value32"','"value13","value23","value33"') 

$itemNotFound = $true 
ForEach ($item in $arr) 
{ 
    If ($itemNotFound) 
    { 
     If ($item -like "*`"value24`"*") 
     { 
      $itemNotFound = $false 
     } 
    } 

} 
if ($itemNotFound) 
{ 
    Write-Host "Not Found value24" 
} 


$itemNotFound = $true 
ForEach ($item in $arr) 
{ 
    If ($itemNotFound) 
    { 
     If ($item -like "*`"value22`"*") 
     { 
      $itemNotFound = $false 
     } 
    } 

} 
if ($itemNotFound) 
{ 
    Write-Host "Not Found value22" 
} 

輸出將是:

Not Found value24