我试图避免使用嵌套的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
谁能告诉我为什么会这样?
答案 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