从一个相当复杂的合同中,我有两个.txt文件。这些文件如下所示:
文件1:
Hash: 5FD876CDF0FCFAF1E7F018F5A8519A7B
Path: /Users/foobar/Desktop/whatever.jpg
文件2:
Hash: 0EDEFB152D489163E603F8C55F5463A7
Path: c:\Migration\Templates\script.exe
这里的目标是比较File1和File2并找到匹配的哈希。找到匹配的哈希后,将它们(和以下路径)输出到另一个.txt文件中。
我对这个问题进行了过多的搜索,但是大多数解决方案都是为了发现差异或设计不同,因此我在Powershell中的专业知识还远远不足以正确地重写它们。
# pattern to match the Hashes from File2
$pattern = "^[a-f0-9]{32}$"
# read in File1 as an array to compare to
$set1 = Get-Content -Path 'C:\File1.txt'
# prepare to collect the results
$results = New-Object -TypeName System.Text.StringBuilder
# start scanning the text2 file for matches to text1 entries
Get-Content -Path 'C:\File2.txt'
if ($_ -match $pattern)
{
$hashes = $Matches['hash']
if ($hashes -in $set1)
{
[void]$results.AppendLine($_)
}
}
}
# output the results
$results.ToString() | Out-File -FilePath 'C:\output.txt' -Encoding ascii
上面的代码还不够匹配,我需要帮助来完成它!
感谢您阅读我的帖子!
答案 0 :(得分:1)
^
)且不包含前缀Hash:
。 (?sm)
。 我建议:
Compare-Object
获取匹配对,或者Group-Object
,如果每个组计数超过1,则输出具有所有路径的组。以下脚本从给定文件中提取哈希/路径对,并将其作为[PSCustomObject]输出。
## Q:\Test\2019\07\20\SO_57124977.ps1
function Extract-HashPath($filename){
$Pattern = '(?sm)^Hash: (?<Hash>[0-9A-F]{32})(\r?\n)*Path: (?<Path>.*?)$'
((Get-Content $filename -raw) |
Select-String -Pattern $Pattern -AllMatches).Matches.Groups | ForEach-Object{
Set-Variable -Name $_.Name -Value $_.Value
if ($_.Name -eq 'Path'){
[PSCustomObject]@{
Hash = $Hash
Path = $Path
}
}
}
}
$File1HashPath = Extract-HashPath '.\File1.txt'
$File2HashPath = Extract-HashPath '.\File2.txt'
$File1HashPath
$File2HashPath
使用上述文件中的文本对输出进行采样(其中不包含可比较的哈希)
> Q:\Test\2019\07\20\SO_57124977.ps1 Hash Path ---- ---- 5FD876CDF0FCFAF1E7F018F5A8519A7B /Users/foobar/Desktop/whatever.jpg 0EDEFB152D489163E603F8C55F5463A7 c:\Migration\Templates\script.exe