Powershell 子字符串检查

Powershell substring check

我有这个简单的脚本。如果它们包含子字符串,我只想匹配文件名。但是它不适用于 -likeContains。正确的做法是什么?

$i = 0
$list1 = @('Gold','Silver')
$list2 = @('W0A-209-193-210_TVIA_Silver_20220520-100001.pdf','W0A-209-195-20_TVIA_Gold_20220520-095934.pdf')
foreach($item in $list2)
    
{
    Write-Host $list1[$i]
    if ($item -like $list1[$i])
    {   
        Write-Host $item + $list1[$i]
        
    }
    $i++
}

预期输出

W0A-209-193-210_TVIA_Silver_20220520-100001.pdf Silver

W0A-209-195-20_TVIA_Gold_20220520-095934.pdf Gold

也根据 答案尝试了此代码,但仍然没有输出

$list1 = @('Gold','Silver')
$list2 = @('W0A-209-193-210_TVIA_Silver_20220520-100001.pdf','W0A-209-195-20_TVIA_Gold_20220520-095934.pdf')
foreach($item in $list2)    
{
    foreach($name in $list1)
        {   
            if ($item -like $name)
                {   
                    Write-Host $item + $name
                }
        
        }
    
}

我会这样解决:

$list1 = @('Gold','Silver')
$list2 = @('W0A-209-193-210_TVIA_Silver_20220520-100001.pdf','W0A-209-195-20_TVIA_Gold_20220520-095934.pdf')

foreach( $filename in $list2 ){
    $list1.Where{ $fileName.Contains( $_ ) }.ForEach{ "$fileName $_" }
}

$list1.Where{ $fileName.Contains( $_ ) } 根据给定条件(如果当前文件名包含子字符串)过滤 $list1$_指的是$list1的当前元素。

.ForEach{ "$fileName $_" } 为每个过滤后的元素调用并生成所需的输出。

.Where.ForEach 都是 intrinsic methods,可用于所有 PowerShell 对象,但在应用于集合(或一般情况下,实现 [= 的类型)时最有意义20=]).


另一种方法是使用正则表达式匹配。通过使用 RegEx 交替运算符 |:

加入列表项,从 $list1 创建一个 RegEx
$list1 = @('Gold','Silver')
$list1RegEx = $list1 -join '|'

$list2 = @('W0A-209-193-210_TVIA_Silver_20220520-100001.pdf','W0A-209-195-20_TVIA_Gold_20220520-095934.pdf')

foreach( $filename in $list2 ){
    if( $filename -match $list1RegEx ) {
        '{0} {1}' -f $fileName, $matches[0]
    }
}

匹配成功后,$matches[0]包含第一个匹配的子串。

作为另一种变体,我使用 format operator -f 来产生所需的结果。


至于你试过的:

您的第二种方法看起来最有希望。它只是在 -like 条件中有一个小错误。 -like 运算符不执行子字符串搜索,除非您使用通配符:

$list1 = @('Gold','Silver')
$list2 = @('W0A-209-193-210_TVIA_Silver_20220520-100001.pdf','W0A-209-195-20_TVIA_Gold_20220520-095934.pdf')

foreach($item in $list2)    
{
    foreach($name in $list1)
    {   
        if ($item -like "*$name*")
        {   
            Write-Host "$item $name"
        }
    }    
}