Public/Test-IgugaChecksumFile.ps1

function Test-IgugaChecksumFile {
    <#
    .SYNOPSIS
        Validate checksum file
    .DESCRIPTION
        Validate a give checksum file
    .PARAMETER FilePath
        Sets the path to a given checksum file
    .PARAMETER BasePath
        Used with Validate mode, sets the base path. This parameter is usefull when the paths inside of the checksum file are
        relative and the file being validated is located in a not related path.
    .PARAMETER Algorithm
        Sets the hashing algorithm to be used in the checksum validation. The allowed algotithms are: MD5, SHA1, SHA256, SHA384 and SHA512
    .PARAMETER Silent
        Omitte the progress status
    .EXAMPLE
        # Perform a validate operation on a checksum file
        Test-IgugaChecksumFile -Path C:\Test\SHA512SUMS.txt -Algorithm SHA512
    #>

    [OutputType([IgugaValidateResult[]])]
    [CmdletBinding()]
    Param(
        [Parameter(Position = 0,
        Mandatory = $true,
        HelpMessage = "The path to a given file checksum file")]
        [string]
        $FilePath,

        [string]
        $BasePath,

        [ValidateSet("MD5", "SHA1", "SHA256", "SHA384", "SHA512")]
        [string]
        $Algorithm = "SHA256",

        [switch]
        $Silent
    )

    $Results = @()

    $WindowsDirSep = [System.IO.Path]::DirectorySeparatorChar
    $LinuxDirSep = [System.IO.Path]::AltDirectorySeparatorChar

    if ($PSBoundParameters.ContainsKey("BasePath") -and -not([string]::IsNullOrWhiteSpace($BasePath))) {
        if (-not(Test-Path -LiteralPath $BasePath -PathType Container)) {
            throw [IgugaError]::PathNotFound($Script:LocalizedData.ErrorBasePathNotFound, $BasePath)
        }
        $BasePath = Get-IgugaCanonicalPath -Path $BasePath
    }

    if (Test-Path -LiteralPath $FilePath -PathType Leaf) {
        $runningChar = "/"
        Get-Content -LiteralPath $FilePath | ForEach-Object {
            if (-not($Silent.IsPresent)) {
                $runningChar = if ($runningChar -eq "/") { "\" } else { "/" }
                Write-Progress -Activity $($Script:LocalizedData.ValidateOpProgressMessage -f $FilePath) -Status $($Script:LocalizedData.ValidateOpProgressStatus -f $runningChar)
            }

            $SplitChecksum = $_.Split(" ", 2)
            $CurrentStoredHash = $SplitChecksum[0].Trim().ToUpper()
            $CurrentStoredFilePath = $SplitChecksum[1].Trim()

            # Check if the file path is relative
            if (-not([System.IO.Path]::IsPathRooted($CurrentStoredFilePath))) {
                if ([string]::IsNullOrWhiteSpace($BasePath)) {
                    $BasePath = (Get-Item -LiteralPath $FilePath).Directory.FullName
                }

                $CurrentStoredFilePath = Join-Path -Path $BasePath -ChildPath $CurrentStoredFilePath
            }

            $CurrentStoredFilePath = $CurrentStoredFilePath.Replace($WindowsDirSep, $LinuxDirSep).TrimEnd($LinuxDirSep)

            if (Test-Path -LiteralPath $CurrentStoredFilePath -PathType Leaf) {
                $ReturnedHash = (Get-IgugaChecksum -FilePath $CurrentStoredFilePath -Algorithm $Algorithm).Hash
                if ($ReturnedHash.Equals($CurrentStoredHash) ) {
                    $Results += [IgugaValidateResult]::new($CurrentStoredFilePath, "PASS", $CurrentStoredHash, $ReturnedHash)
                }
                else {
                    $Results += [IgugaValidateResult]::new($CurrentStoredFilePath, "FAIL", $CurrentStoredHash, $ReturnedHash)
                }
            } else {
                $Results += [IgugaValidateResult]::new($CurrentStoredFilePath, "NOT_FOUND")
            }
        }

        if (($Results.Length -gt 0) -and -not($Silent.IsPresent)) {
            Write-Progress -Activity $Script:LocalizedData.ValidateOpProgressCompleted -Completed
        }
    } else {
        throw [IgugaError]::PathNotFound($Script:LocalizedData.ErrorPathNotFound, $FilePath)
    }

    Write-Output $Results -NoEnumerate
}