根据另一个对象中的字符串在一个对象中查找行

Find lines in one Object based on strings in other object

根据另一个文件中的行在一个文件中查找行。

我有一个对象 $A,其中包含一些行:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2
218e0d2a-0e8b-4a68-8136-8f5dd749a614

我想在对象 $B 中找到这些行的匹配项,并将包含匹配项的行打印到输出文件。

我已经尝试了一个星期了(我在 powershell 的第一周 :)) 我来到了:

$F = $B | ForEach-Object{ $A | Select-String -Pattern $_$ -AllMatches| Select-Object line } 

但这并没有给我任何返回结果。

谁愿意帮助我?

如果你想用你的第一个数组匹配第二个数组中的字符串的一部分,你可以像下面的代码那样做:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("Something 0c7d3283-bec2-4db1-9078-ebb79d21afdf", "Something else 200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "Something also e3df3978-beb7-4545-bc48-ff40d8453be1")

foreach ($Line in $A) {
    if($B -match $Line) {
        $B | Where-Object {$_ -match $Line}
    }
}

我们首先遍历第一个对象中的所有行,然后比较该行是否与第二个数组中的任何内容匹配。如果找到匹配项,我们将遍历数组 B 以找到 A 中的行匹配的位置。

你可以让这段代码更漂亮,但这是我能写的最容易理解的方式。

旧答案
您可以使用 Compare-Object cmdlet 比较两个数组,然后使用 -IncludeEqual 开关显示匹配项,然后使用 -ExcludeDifferent 开关删除不匹配的结果。 然后获取该输出并放入文件中。一个简单的测试可能是这样的:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "e3df3978-beb7-4545-bc48-ff40d8453be1")


(Compare-Object -ReferenceObject $A -DifferenceObject $B -ExcludeDifferent -IncludeEqual).InputObject | Out-File .\output.txt

这应该在您的 Shells 当前工作目录中输出一个文件,其中包含两个匹配的 GUID:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2

不匹配的不包含