在powershell中获取大文件的md5校验和

在powershell中获取大文件的md5校验和,powershell,Powershell,我使用了上面的查询,但得到了下面的错误 调用带有“1”参数的“ReadAllBytes”时出现异常:“文件是 太长。此操作当前仅限于支持较少的文件 大小超过2 GB。” 在下面试用 Function calculateMD5($filename) { $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $hash = [System.BitConverter]::ToString($m

我使用了上面的查询,但得到了下面的错误

调用带有“1”参数的“ReadAllBytes”时出现异常:“文件是 太长。此操作当前仅限于支持较少的文件 大小超过2 GB。”

在下面试用

Function calculateMD5($filename) {
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($filename)))
$hash = $hash -replace '-', ''

return $hash.ToLower()}

但是,我PowerShell停止使用此

正如其他人评论的那样,在PowerShell中,您应该使用cmdlet:

但是,如果您想使用.Net方法执行此操作,我建议您将函数更改为:

(Get-FileHash -Path $filename -Algorithm MD5).Hash.ToLower()

上述内容符合函数名称中的
动词-名词约定,并在内部使用流。

正如其他人所评论的,在PowerShell中,您应该使用cmdlet:

但是,如果您想使用.Net方法执行此操作,我建议您将函数更改为:

(Get-FileHash -Path $filename -Algorithm MD5).Hash.ToLower()

上述操作符合函数名称中的
动词-名词约定,并在内部使用流。

您是否尝试了cmdlet?@Vivek Get FileHash not working确实是正确的PowerShell方法(区别在于PowerShell在流式处理整个文件时几乎不使用任何内存)。请详细说明“不工作”…如果有帮助的话,我只是在一个3GB的文件上尝试了
获取FileHash
,我用FS util创建了这个文件,它工作了,可以理解,速度很慢,但它工作了。我要指出,将数据读入内存通常会导致内存消耗为读取文件大小的4倍。通常我认为内存问题被夸大了,但在这种情况下,你可能需要考虑它。你尝试过CMDLET吗?@维韦克FielHeHASE不工作确实是正确的PuxBeSE方法(不同的是,POWER S壳在整个文件流中几乎不使用任何内存)。请详细说明“不工作”…如果有帮助的话,我只是在一个3GB的文件上尝试了
获取FileHash
,我用FS util创建了这个文件,它工作了,可以理解,速度很慢,但它工作了。我要指出,将数据读入内存通常会导致内存消耗为读取文件大小的4倍。通常我认为记忆的担忧被夸大了,但在这种情况下,你可能需要考虑它。非常感谢你。它在服务器上运行。非常感谢。它在服务器上工作。
function Get-FileMD5 {
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
        [Alias('FileName','FilePath')]
        [string]$Path
    )
    $hasher = [System.Security.Cryptography.MD5]::Create()
    $stream = [System.IO.FileStream]::new($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)

    $result = [System.BitConverter]::ToString($hasher.ComputeHash($stream))
    $stream.Dispose()
    $hasher.Dispose()
    $result.Replace("-","").ToLower()
}