Public/Get-SpecMDFileHashBase64.ps1

function Get-SpecMDFileHashBase64 {
    <#
    .SYNOPSIS
    Calculates the MD5 hash of a file and returns it as a Base64-encoded string.
 
    .DESCRIPTION
    The Get-SpecMDFileHashBase64 function calculates the MD5 hash of a file and returns it as a Base64-encoded string. It supports two parameter sets: FilePath and FileURL.
 
    .PARAMETER FilePath
    Specifies the path to the file for which the MD5 hash needs to be calculated. This parameter is mandatory when using the "FilePath" parameter set.
 
    .PARAMETER FileURL
    Specifies the URL of the file for which the MD5 hash needs to be calculated. This parameter is mandatory when using the "FileURL" parameter set.
 
    .INPUTS
    None. You cannot pipe input to this function.
 
    .OUTPUTS
    System.String
    The function returns a Base64-encoded string representing the MD5 hash of the file.
 
    .EXAMPLE
    PS> Get-SpecMDFileHashBase64 -FilePath "C:\Files\example.txt"
    Calculates the MD5 hash of the file located at "C:\Files\example.txt" and returns the hash as a Base64-encoded string.
 
    .EXAMPLE
    PS> Get-SpecMDFileHashBase64 -FileURL "https://example.com/files/example.txt"
    Calculates the MD5 hash of the file located at the specified URL and returns the hash as a Base64-encoded string.
 
    .NOTES
    Author: andy.naftel
    Date: 30-May-2023
    Version
        1.0 - Initial function (AN)
        1.1 - Incorporated getting remote file, inline comments and added comment based help (OH)
#>


    [cmdletbinding(DefaultParameterSetName = "FilePath")]
    param (
        [parameter(Mandatory = $true, ParameterSetName = "FilePath")]
        $FilePath,

        [parameter(Mandatory = $true, ParameterSetName = "FileURL")]
        $FileURL
    )

    if ($PSCmdlet.ParameterSetName -eq "FilePath") {
        try {
            $rawMD5 = (Get-FileHash -Path $FilePath -Algorithm MD5).Hash

            # Create an array of bytes to store the hash values
            $hashBytes = [byte[]]::new($rawMD5.Length / 2)

            # Convert each pair of characters from the rawMD5 string to a byte and store it in the hashBytes array
            For ($i = 0; $i -lt $rawMD5.Length; $i += 2) {
                $hashBytes[$i / 2] = [convert]::ToByte($rawMD5.Substring($i, 2), 16)
            }

            # Convert the byte array to a Base64 string and return it
            return [system.convert]::ToBase64String($hashBytes)
        } catch {
            Write-Error $_.Exception.Message
            return 1
        }
    }

    if ($PSCmdlet.ParameterSetName -eq "FileURL") {
        try {
            # Send a HEAD request to the specified URL to retrieve the header information
            $hashCheck = Invoke-WebRequest -Method Head -Uri $FileUrl -UseBasicParsing

            # Check if the request was successful (status code 200)
            if ($hashCheck.StatusCode -ne 200) {
                # If the request was not successful, throw a new WebException
                throw [System.Net.WebException]::new('Failed to get header content.')
            }

            # Retrieve the Content-MD5 header value and return it
            return $($hashCheck.Headers['Content-MD5'])
        } catch {
            Write-Error $_.Exception.Message
            return 1
        }
    }
}