使用-notcontains在数组中的字符串中查找子字符串

时间:2016-03-04 16:54:58

标签: powershell powershell-v3.0

我试图避免使用嵌套的ForEach循环作为更大代码的一部分。为此,我使用了-notcontains运算符。基本上,我想看看数组中的字符串中是否存在子字符串。如果它存在,则不执行任何操作,如果它不存在,则打印" Not Found"。

这是代码......

$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

谁能告诉我为什么会这样?

3 个答案:

答案 0 :(得分: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"
}

答案 1 :(得分:2)

我对解决方案的看法:

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

使用V3 .foreach()方法:

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

还有另一种可能性:

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

答案 2 :(得分: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