Powershell 子字符串检查
Powershell substring check
我有这个简单的脚本。如果它们包含子字符串,我只想匹配文件名。但是它不适用于 -like
或 Contains
。正确的做法是什么?
$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"
}
}
}
我有这个简单的脚本。如果它们包含子字符串,我只想匹配文件名。但是它不适用于 -like
或 Contains
。正确的做法是什么?
$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"
}
}
}