PowerShell script to calculate a hash value for specified input file (or directory).
##############################################################################
##
## Get-FileHash
##
## From Windows PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
##############################################################################
<#
.SYNOPSIS
Get the hash of an input file.
.EXAMPLE
Gets the hash of a specific file:
PS > Get-FileHash myFile.txt
.EXAMPLE
Gets the hash of files from the pipeline
dir | Get-FileHash
.EXAMPLE
Gets the has of myFile.txt, using the SHA1 hashing algorithm
Get-FileHash myFile.txt -Hash SHA1
#>
param(
## The path of the file to check
$Path,
## The algorithm to use for hash computation
[ValidateSet("MD5", "SHA1", "SHA256", "SHA384", "SHA512")]
$HashAlgorithm = "MD5"
)
Set-StrictMode -Version 3
## Create the hash object that calculates the hash of our file.
$hashType = [Type] "System.Security.Cryptography.$HashAlgorithm"
$hasher = $hashType::Create()
## Create an array to hold the list of files
$files = @()
## If they specified the file name as a parameter, add that to the list
## of files to process
if($path)
{
$files += $path
}
## Otherwise, take the files that they piped in to the script.
## For each input file, put its full name into the file list
else
{
$files += @($input | Foreach-Object { $_.FullName })
}
## Go through each of the items in the list of input files
foreach($file in $files)
{
## Skip the item if it is not a file
if(-not (Test-Path $file -Type Leaf)) { continue }
## Convert it to a fully-qualified path
$filename = (Resolve-Path $file).Path
## Use the ComputeHash method from the hash object to calculate
## the hash
$inputStream = New-Object IO.StreamReader $filename
$hashBytes = $hasher.ComputeHash($inputStream.BaseStream)
$inputStream.Close()
## Convert the result to hexadecimal
$builder = New-Object System.Text.StringBuilder
$hashBytes | Foreach-Object { [void] $builder.Append($_.ToString("X2")) }
## Return a custom object with the important details from the
## hashing
$output = New-Object PsObject -Property @{
Path = ([IO.Path]::GetFileName($file));
HashAlgorithm = $hashAlgorithm;
HashValue = $builder.ToString()
}
$output
}