将一个数组中的字符串与另一个数组中的通配符字符串进行比较

时间:2018-06-22 07:16:36

标签: arrays powershell compare wildcard

我有两个数组$a$b,在数组$a中是一个字符串,可以部分匹配$b中的一项,假设我可以使用通配符:

$a = "1", "Computer Name", "2"
$b = "3", "4", "Full Computer Name Here"

foreach ($line in $a) {
    foreach ($line2 in $b) {
         where "*$line*" -like "*$line2*"
    }
}

在尝试了所有简单的“此数组与该数组匹配”之后,我来到了这里,进入foreach中的一个数组,然后尝试了所有Select-StringCompare-Object $line $line2 -ExcludeDifferent -IncludeEqual -PassThru,但是可以”什么都没做。

理想情况下,它会在匹配的地方返回“此处是完整的计算机名”。

3 个答案:

答案 0 :(得分:7)

您尝试过吗?

$a = "1","Computer Name","2"
$b = "3","4","Full Computer Name Here"
foreach ($line in $a ) {
    $b -match $line
}

编辑: 尽管@Ansgar在评论中说明了它的简单性,但它可能不是最佳答案。有时PowerShell如此不一致,这使我想知道为什么我仍然使用它。

答案 1 :(得分:6)

Where-Object不能那样工作。它从您的代码中没有的管道中读取。另外,您的比较是向后的,并且不能在参考值中添加通配符。

将您的代码更改为以下内容:

foreach ($line in $a) {
    $b | Where-Object { $_ -like "*${line}*" }
}

或类似这样:

foreach ($line in $a) {
    foreach ($line2 in $b) {
        if ($line2 -like "*${line}*") { $line2 }
    }
}

它将满足您的期望。

编辑:

我一直忘记比较运算符也可以用作枚举器,因此可以将后一个示例简化为这样的形式(删除嵌套循环和条件循环):

foreach ($line in $a) {
    $b -like "*${line}*"
}

答案 2 :(得分:2)

$b | Where {$_ | Select-String $a}

更新于2018-06-23

对LotsPings的评论将其最小化,以进一步做到:

显然,Select-String本身已经具有两个迭代器,因此可以简化为:

$b | Select-String $a

PS C:\> $a = "1", "Computer Name", "Other Name"
PS C:\> $b = "Computer", "4", "Full Computer Name Here", "something else", "Also full computer name here"
PS C:\> $b | Select-String $a

Full Computer Name Here
Also full computer name here