PowerShell 脚本 比较两文件差异(带粗狂进度条)并汇总输出

ops/2024/10/21 7:16:35/

一上来就放代码

function Compare-FileHex {param ([Parameter(Mandatory=$true)][string]$SourceFile,[Parameter(Mandatory=$true)][string]$CompareFile,[Parameter(Mandatory=$false)][string]$OutputFile,[Parameter(Mandatory=$false)][int]$BufferSize = 1MB)function Format-FileSize {param ([long]$Size)if ($Size -ge 1GB) { "{0:N2} GB" -f ($Size / 1GB) }elseif ($Size -ge 1MB) { "{0:N2} MB" -f ($Size / 1MB) }elseif ($Size -ge 1KB) { "{0:N2} KB" -f ($Size / 1KB) }else { "$Size Bytes" }}$sourceStream = [System.IO.File]::OpenRead($SourceFile)$compareStream = [System.IO.File]::OpenRead($CompareFile)$results = New-Object System.Collections.Generic.List[PSCustomObject]$buffer1 = New-Object byte[] $BufferSize$buffer2 = New-Object byte[] $BufferSize$totalLength = [Math]::Max($sourceStream.Length, $compareStream.Length)$position = 0$sourceSize = $sourceStream.Length$compareSize = $compareStream.Lengthtry {while ($position -lt $totalLength) {$read1 = $sourceStream.Read($buffer1, 0, $BufferSize)$read2 = $compareStream.Read($buffer2, 0, $BufferSize)$maxRead = [Math]::Max($read1, $read2)for ($i = 0; $i -lt $maxRead; $i++) {$sourceByte = if ($i -lt $read1) { $buffer1[$i] } else { $null }$compareByte = if ($i -lt $read2) { $buffer2[$i] } else { $null }if ($sourceByte -ne $compareByte) {$results.Add([PSCustomObject]@{Address = $position + $iSourceFile = if ($sourceByte -ne $null) { "{0:X2}" -f $sourceByte } else { "--" }CompareFile = if ($compareByte -ne $null) { "{0:X2}" -f $compareByte } else { "--" }})}}$position += $maxRead$percentComplete = [math]::Round(($position / $totalLength) * 100, 2)Write-Progress -Activity "比较文件" -Status "$percentComplete% 完成" -PercentComplete $percentComplete}}finally {$sourceStream.Close()$compareStream.Close()}Write-Progress -Activity "比较文件" -Completed$sourceSizeFormatted = Format-FileSize -Size $sourceSize$compareSizeFormatted = Format-FileSize -Size $compareSize$summary = @"
源文件:$SourceFile
大小: $sourceSizeFormatted比较文件:$CompareFile
大小: $compareSizeFormatted不同之处: $($results.Count) 字节
详细如下:"@$detailedOutput = "地址       源文件    比较文件`n"$detailedOutput += "--------------------------`n"$lastAddress = -1foreach ($result in $results) {if ($lastAddress -ne -1 -and $result.Address -ne $lastAddress + 1) {$detailedOutput += "`n"  # 添加空行表示不连续}$detailedOutput += "0x{0:X8}  {1}        {2}`n" -f $result.Address, $result.SourceFile, $result.CompareFile$lastAddress = $result.Address}$fullOutput = $summary + $detailedOutputif ($OutputFile) {$fullOutput | Out-File -FilePath $OutputFile -Encoding utf8Write-Host "结果已保存到: $OutputFile"}Write-Host $fullOutput
}

2、调用

        假设您将函数保存在名为 Compare-FileHex.ps1 的文件中。在您想要使用这个函数的其他 PowerShell 脚本中,您可以这样导入和使用它:

  1.  导入 Compare-FileHex 函数 . "C:\Path\To\Compare-FileHex.ps1"

  2.  现在您可以使用这个函数了 Compare-FileHex -SourceFile "path\to\source\file" -CompareFile "path\to\compare\file" -OutputFile "path\to\output.txt"

 3、效果 (gif 随便看了。渣画质)

分别采用两组参数 (不带生成txt与带生成txt的 f:\play.txt)
4、 生成的txt内容

源文件:D:\Program Files\Sublime Text\sublime_text.exe.old
大小: 7.74 MB

比较文件:D:\Program Files\Sublime Text\sublime_text.exe
大小: 7.74 MB

不同之处: 6 字节
详细如下:
地址       源文件    比较文件
--------------------------
0x0001A4E8  80        C6
0x0001A4E9  79        41

0x0001A4EB  00        01
0x0001A4EC  0F        B2
0x0001A4ED  94        00
0x0001A4EE  C2        90

5、结束语

        自用编制注册机时候的帮助工具,不用装什么软件工具。大文件,大差异没试验过,加了缓存参数,有兴趣自己试试吧,全源码公开。


http://www.ppmy.cn/ops/127207.html

相关文章

刷题/学习网站推荐

前言: 最近没怎么学习,荒芜生活,学不进去,太累了,就喜欢翻翻网站有没有好用的东西分享给大家,正好看到一些刷题的网站(其实也是学习的网站吧),相比学程序的很多都是力扣…

详解Oracle审计(二)

题记: 本文将承接上篇详细介绍oracle的审计功能,基于11g版本,但对12c,19c也同样适用。 1. 语句审计实操演示实例 sqlplus / as sysdba show parameter audit_trail alter system set audit_traildb_extended scopespfile; star…

关于Spring Framework路径遍历漏洞(CVE-2024-38816)的预警提示和修复方案

一、漏洞详情 Spring Framework是一个Java应用程序框架,旨在提供高效且可扩展的开发环境。 近日,监测到Spring Framework中修复了一个路径遍历漏洞(CVE-2024-38816)。Spring Framework受影响版本中,使用WebMvc.fn 或…

TCP与UDP

端口 每个应用程序进出网络都需要经过一个唯一端口,通过端口号来识别数据交由哪个应用程序处理。服务端:固定端口号。客户端:1024以上随机端口。知名端口号: TCP80:HTTPTCP20:FTPTCP23:TelnetT…

大数据新视界 --大数据大厂之 Serverless 架构下的大数据处理:简化与高效的新路径

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【分布式微服务云原生】《逃离单体地狱:微服务架构的挑战与机遇》

标题:《逃离单体地狱:微服务架构的挑战与机遇》 摘要:本文深入探讨了“单体地狱”的概念及其带来的问题,以及从单体应用向微服务架构过渡时所面临的挑战和机遇。读者将了解到单体应用的困境、微服务架构的优势与复杂性&#xff0…

大数据新视界 --大数据大厂之 Ray:分布式机器学习框架的崛起

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Redis设计与实现 学习笔记 第九章 数据库

第9章到第14章属于本书第二部分:单机数据库的实现。 9.1 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态结构redis.h/redisServer的db数组中,db数组的每一项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库&…