Internal/_getHash.ps1
<# .SYNOPSIS Gets the hash value of a file or string .DESCRIPTION Gets the hash value of a file or string It uses System.Security.Cryptography.HashAlgorithm (http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx) and FileStream Class (http://msdn.microsoft.com/en-us/library/system.io.filestream.aspx) Based on: http://blog.brianhartsock.com/2008/12/13/using-powershell-for-md5-checksums/ and some ideas on Microsoft Online Help Be aware, to avoid confusions, that if you use the pipeline, the behaviour is the same as using -Text, not -File .PARAMETER File File to get the hash from. .PARAMETER Text Text string to get the hash from .PARAMETER Algorithm Type of hash algorithm to use. Default is SHA1 .EXAMPLE C:\PS> Get-Hash "hello_world.txt" Gets the SHA1 from myFile.txt file. When there's no explicit parameter, it uses -File .EXAMPLE Get-Hash -File "C:\temp\hello_world.txt" Gets the SHA1 from myFile.txt file .EXAMPLE C:\PS> Get-Hash -Algorithm "MD5" -Text "Hello Wold!" Gets the MD5 from a string .EXAMPLE C:\PS> "Hello Wold!" | Get-Hash We can pass a string throught the pipeline .EXAMPLE Get-Content "c:\temp\hello_world.txt" | Get-Hash It gets the string from Get-Content .EXAMPLE Get-ChildItem "C:\temp\*.txt" | %{ Write-Output "File: $($_) has this hash: $(Get-Hash $_)" } This is a more complex example gets the hash of all "*.tmp" files .NOTES DBA daily stuff (http://dbadailystuff.com) by Josep Mart�nez Vil� Licensed under a Creative Commons Attribution 3.0 Unported License .LINK Original post: http://dbadailystuff.com/2013/03/11/get-hash-a-powershell-hash-function/ #> function _getHash { Param ( [parameter(Mandatory=$true, ValueFromPipeline=$true, ParameterSetName="set1")] [String]$text, [parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false, ParameterSetName="set2")] [String]$file = "", [parameter(Mandatory=$false, ValueFromPipeline=$false)] [ValidateSet("MD5", "SHA", "SHA1", "SHA-256", "SHA-384", "SHA-512")] [String]$algorithm = "SHA1" ) begin { $hashAlgorithm = [System.Security.Cryptography.HashAlgorithm]::Create($algorithm) } process { $md5StringBuilder = New-Object -TypeName System.Text.StringBuilder -ArgumentList 50 $ue = New-Object -TypeName System.Text.UTF8Encoding if ($file){ try { if (!(Test-Path -LiteralPath $file)){ throw $msgs.cc_file_not_found } } catch { throw $msgs.gh_file_read_error -f $file, $_ } try { [System.IO.FileStream]$fileStream = [System.IO.File]::Open($file, [System.IO.FileMode]::Open); $hashAlgorithm.ComputeHash($fileStream) | ForEach-Object { [void] $md5StringBuilder.Append($_.ToString("x2")) } } catch { throw $msgs.gh_file_hash_error } finally { $fileStream.Close() $fileStream.Dispose() } } else { $hashAlgorithm.ComputeHash($ue.GetBytes($text)) | ForEach-Object { [void] $md5StringBuilder.Append($_.ToString("x2")) } } return $md5StringBuilder.ToString() } } |