Powershell 如何检查一个文件是否与另一个文件“基本”相同?

Powershell 如何检查一个文件是否与另一个文件“基本”相同?,powershell,Powershell,我需要使用Powershell检查两个文件是否相同,但有以下限制:前2K中有八个特定字节允许不同(如果您感兴趣,它是ext4映像的超级块中的特定时间戳字节) 我在Stack Overflow(显然)上找到的用于执行完全检查的代码如下: $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $hash = [System.BitConverter]::ToString(

我需要使用Powershell检查两个文件是否相同,但有以下限制:前2K中有八个特定字节允许不同(如果您感兴趣,它是ext4映像的超级块中的特定时间戳字节)

我在Stack Overflow(显然)上找到的用于执行完全检查的代码如下:

$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString(
            $md5.ComputeHash([System.IO.File]::ReadAllBytes("fspec.bin")))
$restOfFile = [System.IO.File]::ReadAllBytes("fspec")
$firstTwoK = $restOfFile[0..2048]
$restOfFile = $restOfFile[2048..$restOfFile.Length]
# Then:
#    1. Check bytes in firstTwoK.
#    2. Check MD5 of all bytes in restOfFile.
这为我提供了整个文件的哈希值,但我真正需要的是:

  • 文件的前2K作为字节数组,以便我可以检查细节;及
  • 要检查相等性的文件其余部分的校验和
System.IO.File
类具有
ReadAllBytes
,但似乎没有能力读取文件的某个部分,也无法查找特定位置

我试图读入字节数组,并使用数组切片来获得如下部分:

$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString(
            $md5.ComputeHash([System.IO.File]::ReadAllBytes("fspec.bin")))
$restOfFile = [System.IO.File]::ReadAllBytes("fspec")
$firstTwoK = $restOfFile[0..2048]
$restOfFile = $restOfFile[2048..$restOfFile.Length]
# Then:
#    1. Check bytes in firstTwoK.
#    2. Check MD5 of all bytes in restOfFile.
不幸的是,它是一个750M文件这一事实正在导致问题:

Array dimensions exceeded supported range.
At C:\testprog\testprog.ps1:42 char:1
+ ${devBytes} = ${devBytes}[2048..${devBytes}.Length]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], OutOfMemoryException
    + FullyQualifiedErrorId : System.OutOfMemoryException

是否有一种功能性的方法来执行我需要的操作?

使用派生的类型之一,并使用其
ComputeHash
方法来指定偏移量。为了检查文件的唯一性,如果您选择,也可以使用更强大的算法:

$fileBytes = [System.File.IO]::ReadAllBytes("C:\path\to\file.ext")
$md5Cng = [System.Security.Cryptography.MD5Cng]::Create()
$fileHashAfterOffset = $md5Cng.ComputeHash( $fileBytes, 2KB, $fileBytes.length - 2KB )
ComputeHash
的第一个参数是作为
字节[]
的文件。第二个参数是偏移量(例如,在生成哈希时不包括第一个
x
字节),第三个参数是要计算的字节数。在本例中,我们需要文件的其余部分,因此我们取
$fileBytes
数组中的总字节数,并从中减去偏移量


使用
2KB
是以2KB为单位获取字节数的简写方法。

HashAlgorithm类有一个接受您感兴趣的块的偏移量和大小的函数。这是一个很好的答案。我最后做的(在发布之前)只是将不相关的字节从一个数组复制到另一个数组,然后对这两个数组进行散列并比较散列(只有在正常最小冲突可能性范围内,所有未复制的字节都相同时,它们才会相等).但我已经测试过了,它很有效,所以我给了你投票权。谢谢