Cómo obtener una suma de comprobación MD5 en PowerShell

Resuelto Luke101 asked hace 12 años • 20 respuestas

Me gustaría calcular una suma de comprobación MD5 de algún contenido. ¿Cómo hago esto en PowerShell?

Luke101 avatar May 10 '12 00:05 Luke101
Aceptado

A partir de PowerShell versión 4, esto es fácil de hacer para archivos listos para usar con el Get-FileHashcmdlet:

Get-FileHash <filepath> -Algorithm MD5

Esto es ciertamente preferible ya que evita los problemas que ofrece la solución para PowerShell anterior como se identifica en los comentarios (usa una secuencia, la cierra y admite archivos grandes).

Si el contenido es una cadena:

$someString = "Hello, World!"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = New-Object -TypeName System.Text.UTF8Encoding
$hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($someString)))

Para versiones anteriores de PowerShell

Si el contenido es un archivo:

$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
vcsjones avatar May 09 '2012 17:05 vcsjones

Si está utilizando las Extensiones de la comunidad de PowerShell, hay un comando Get-Hash que hará esto fácilmente:

C:\PS> "hello world" | Get-Hash -Algorithm MD5


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764
Keith Hill avatar May 09 '2012 22:05 Keith Hill

Aquí hay una función que uso que maneja rutas relativas y absolutas:

function md5hash($path)
{
    $fullPath = Resolve-Path $path
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $file = [System.IO.File]::Open($fullPath,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
    try {
        [System.BitConverter]::ToString($md5.ComputeHash($file))
    } finally {
        $file.Dispose()
    }
}

Gracias a @davor arriba por la sugerencia de usar Open() en lugar de ReadAllBytes() y a @jpmc26 por la sugerencia de usar un bloque finalmente.

David avatar Jul 23 '2013 13:07 David