【问题标题】:Get md5 checksum of large file in powershell在powershell中获取大文件的md5校验和
【发布时间】:2021-04-05 11:53:01
【问题描述】:
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()}

我使用了上面的查询,但出现以下错误

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

在下面尝试过

$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)))

但是我的 PowerShell 停止使用它

【问题讨论】:

  • 您是否尝试过Get-FileHash cmdlet?
  • @Vivek Get-FileHash 不工作
  • Get-FileHash 确实是正确的 PowerShell 方法(不同之处在于 PowerShell 几乎不使用任何内存,因为它 整个文件)。请详细说明“不起作用”...
  • 如果它有帮助,我刚刚在使用 FS util 创建的 3GB 文件上尝试了Get-FileHash,它工作了,可以理解是慢,但它工作了。我要指出将数据读入内存通常会导致内存消耗是读取文件大小的 4 倍。 Reference。通常我认为内存问题被夸大了,但在这种情况下你可能需要考虑它。

标签: powershell


【解决方案1】:

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

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

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

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()
}

以上符合函数名称中的Verb-Noun 约定,并且在内部使用流。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2012-05-18
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多