如何仅输出字符串数组中包含两行或多行关键字匹配的行?

问题描述 投票:0回答:1

使用分配给变量的比较对象:

    $diff = Compare-Object -referenceobject (Get-Content $hashlog1 -Encoding UTF8 | select -skip 1) -differenceobject (Get-Content $hashlog2 -Encoding utf8 | select -skip 1) | 
        Select @{N='Hash'; E={($_.InputObject -split ' ',2)[0] }}, @{N='File'; E={((($_.InputObject -split ' ',2)[1]) -split ' ' | select -skiplast 2) -join ' ' }}, @{N='SizeDate'; E={($_.InputObject -split ' ' | select -last 2) -join ' ' }}, SideIndicator | 
        Format-Table -AutoSize | Out-String -Width 4096

这是一个示例日志文件,在

hashlog.txt
之后将其称为
compare-object

Hash                             File                                            SizeDate               SideIndicator
----                             ----                                            --------               -------------
D41D8CD98F00B204E9800998ECF8427E \added.txt                                      0 20230107_021401      =>           
6B7CA4894B3CFCBA1ECA6B8BB9656FE8 \dirsize2.bat                                   714 20231010_111350    =>           
804AB051DB174BF5FF53911647A094C2 \SSDTest ™\logfile.txt                          122644 20220806_221741 =>           
9266C28971E3624B28DAB39ADEE0694E \SSDTest ™\logfilemixed.txt                     14627 20220807_115714  =>           
4298F8C3383A93D121A1A91764492F93 \SSDTest ™\newfile.rtf                          42098 20231010_111523  =>           
1233EEF8C71A6AF8D23068CCDF1E639D \SSDTest ™\Samsung 850 EVO Small Files Only.txt 205671 20220805_224013 =>           
BD30A4E10CA22E3E3C6BA7063ACEBF0D \SSDTest ™\SSDCopy.bat                          269 20220731_172008    =>           
AF32AC8BEFDF8D3B63DE5D7B834709FD \SSDTest ™\SSDCopysmall.ps1                     1670 20220806_221654   =>           
AA7A12226FDD40671C191FAF6AA57733 \SSDTest ™\SSDCopy_Write_Read.bat               462 20220805_023811    =>           
3EDC4CE7B65FBC140B7D0F5604F3070D \SSDTest ™\SSDMixedWrite.ps1                    2476 20220807_115705   =>           
768B150D59F7EA576F375430883CC8DA \SSDTest ™\SSDRead.ps1                          2044 20220805_021614   =>           
B7D8DA3D9C1387EBCEC0565176385BB7 \SMR FINAL\SMR_PC_TEST_1_FILLRND.log            13014 20220823_134552  <=           
D41D8CD98F00B204E9800998ECF8427E \added.txt                                      0 20230107_021409      <=           
E17C51851C46801F9399087B61736E34 \dirsize2.bat                                   711 20230107_000101    <=           
E7A73A93D06EB266E614FC5110BBBF28 \SMR FINAL\SMR_PC_TEST_1_FILLRND.log            13014 20220822_133356  =>           
804AB051DB174BF5FF53911647A094C2 \SSDTest\logfile.txt                            122644 20220806_221741 <=           
9266C28971E3624B28DAB39ADEE0694E \SSDTest\logfilemixed.txt                       14627 20220807_115714  <=           
1233EEF8C71A6AF8D23068CCDF1E639D \SSDTest\Samsung 850 EVO Small Files Only.txt   205671 20220805_224013 <=           
AF32AC8BEFDF8D3B63DE5D7B834709FD \SSDTest\SSDCopysmall.ps1                       1670 20220806_221654   <=           
AA7A12226FDD40671C191FAF6AA57733 \SSDTest\SSDCopy_Write_Read.bat                 462 20220805_023811    <=           
3EDC4CE7B65FBC140B7D0F5604F3070D \SSDTest\SSDMixedWrite.ps1                      2476 20220807_115705   <=           
768B150D59F7EA576F375430883CC8DA \SSDTest\SSDRead.ps1                            2044 20220805_021614   <=

如何根据

File
属性仅输出匹配两次或多次的条目?因此,例如,上面的日志将导致以下结果:

D41D8CD98F00B204E9800998ECF8427E \added.txt                                      0 20230107_021401      =>           
D41D8CD98F00B204E9800998ECF8427E \added.txt                                      0 20230107_021409      <=           

6B7CA4894B3CFCBA1ECA6B8BB9656FE8 \dirsize2.bat                                   714 20231010_111350    =>           
E17C51851C46801F9399087B61736E34 \dirsize2.bat                                   711 20230107_000101    <=           

B7D8DA3D9C1387EBCEC0565176385BB7 \SMR FINAL\SMR_PC_TEST_1_FILLRND.log            13014 20220823_134552  =>           
E7A73A93D06EB266E614FC5110BBBF28 \SMR FINAL\SMR_PC_TEST_1_FILLRND.log            13014 20220822_133356  <=           

我确实尝试了嵌套

ForEach-Object
,但只输出单个匹配的文件,并没有列出两者。

看起来这应该是直截了当的,但事实并非如此。预先感谢您的任何帮助。

(如果您想知道“商标”符号™,我只是确保特殊字符经过)

powershell sorting foreach
1个回答
0
投票

为了实现您的目标您需要对具有不同属性的对象进行操作,而不是对字符串进行操作:

| Format-Table -AutoSize | Out-String -Width 4096

  • Format-*

     cmdlet 发出输出对象,其唯一目的是向 PowerShell 的用于显示的输出格式化系统提供
    格式化指令。简而言之:仅使用 Format-*
     cmdlet 来格式化数据
    用于显示,切勿用于后续编程处理。 请参阅此答案了解更多信息。

  • 通过另外使用

    Out-String

    ,您最终会得到一个单多行字符串,它以人类的格式表示原始数据,而不是程序化消耗。
    

从管道中删除

Format-Table

 调用 - 这会产生 
objectsarray - 然后通过管道 $diff
(或直接修改后的管道)到 
Group-Object
,如下所示:

$diff | Group-Object File | Where-Object Count -ge 2
这按共享 

.File

 属性值对所有对象进行分组,并使用 
Where-Object
 过滤它们,以便仅输出具有 2 个或更多元素的组。

每个组都是

Microsoft.PowerShell.Commands.GroupInfo

 类型的实例,其 .Groups
 属性是组中所有元素的集合。

© www.soinside.com 2019 - 2024. All rights reserved.