使用分配给变量的比较对象:
$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
,但只输出单个匹配的文件,并没有列出两者。
看起来这应该是直截了当的,但事实并非如此。预先感谢您的任何帮助。
(如果您想知道“商标”符号™,我只是确保特殊字符经过)
为了实现您的目标您需要对具有不同属性的对象进行操作,而不是对字符串进行操作:
| Format-Table -AutoSize | Out-String -Width 4096
Format-*
cmdlet 发出输出对象,其唯一目的是向 PowerShell 的用于显示的输出格式化系统提供格式化指令。简而言之:仅使用
Format-*
cmdlet 来格式化数据用于显示,切勿用于后续编程处理。 请参阅此答案了解更多信息。
Format-Table
调用 - 这会产生objects 的 array - 然后通过管道
$diff
(或直接修改后的管道)到
Group-Object
,如下所示:
$diff | Group-Object File | Where-Object Count -ge 2
这按共享 .File
属性值对所有对象进行分组,并使用
Where-Object
过滤它们,以便仅输出具有 2 个或更多元素的组。
每个组都是 Microsoft.PowerShell.Commands.GroupInfo
.Groups
属性是组中所有元素的集合。