一上来就放代码
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 脚本中,您可以这样导入和使用它:
-
导入 Compare-FileHex 函数 . "C:\Path\To\Compare-FileHex.ps1"
-
现在您可以使用这个函数了 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、结束语
自用编制注册机时候的帮助工具,不用装什么软件工具。大文件,大差异没试验过,加了缓存参数,有兴趣自己试试吧,全源码公开。