我有两个数组$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-String
至Compare-Object $line $line2 -ExcludeDifferent -IncludeEqual -PassThru
,但是可以”什么都没做。
理想情况下,它会在匹配的地方返回“此处是完整的计算机名”。
答案 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