PSCompareHash.psm1
function Get-ObjectHash { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0)] [string]$InputObject, # <== This is important! [Parameter(Position=1)] [ValidateSet("SHA1", "SHA256", "SHA384", "SHA512", "MD5")] [string]$Algorithm = "SHA256" ) if (Test-Path $InputObject -PathType Leaf) { return (Get-FileHash -Path $InputObject -Algorithm $Algorithm).Hash } elseif (Test-Path $InputObject -PathType Container) { $fileHashes = Get-ChildItem -Path $InputObject -Recurse -File | Sort-Object FullName | ForEach-Object { Get-FileHash -Path $_.FullName -Algorithm $Algorithm } | Select-Object -ExpandProperty Hash $finalHash = [System.Security.Cryptography.HashAlgorithm]::Create($Algorithm) $bytes = [System.Text.Encoding]::UTF8.GetBytes(($fileHashes -join "")) $hashBytes = $finalHash.ComputeHash($bytes) return -join ($hashBytes | ForEach-Object { $_.ToString("x2") }) } else { Write-Error "Invalid path provided: $InputObject" return $null } } function Test-FileHash { [CmdletBinding()] param ( [Parameter(Mandatory=$true, Position=0)] [string]$FilePath, [Parameter(Mandatory=$true, Position=1)] [string]$ProvidedHash, [Parameter(Position=2)] [ValidateSet("SHA1", "SHA256", "SHA384", "SHA512", "MD5")] [string]$Algorithm = "SHA256" ) if (-not (Test-Path $FilePath)) { Write-Error "The specified path does not exist: $FilePath" return $false } # Use Get-ObjectHash for hashing files and directories $computedHash = Get-ObjectHash -InputObject $FilePath -Algorithm $Algorithm # Compare hashes if ($computedHash -eq $ProvidedHash) { Write-Output "The hash matches." return $true } else { Write-Output "The hash does not match." return $false } } |