2016-03-04 137 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