Public/Compare-Hashtable.ps1

# ------------------------------------------------------------------------------
# Function to compare hashtables content
# ------------------------------------------------------------------------------
function Compare-Hashtable {
  <#
    .SYNOPSIS
    Compares hashtables content

    .DESCRIPTION
    Check that two given hashtables are identic.

    .PARAMETER Reference
    The Reference parameter should be the hashtable to check.

    .PARAMETER Difference
    The Difference parameter should be the hashtable against which to check the
    first one.

    .OUTPUTS
    Boolean. Compare-Hashtable returns a boolean depnding on the result of the
    comparison between the two hashtables.

    .EXAMPLE
    Compare-Hashtable -Reference $Hashtable1 -Difference $Hashtable2
  #>

  [CmdletBinding ()]
  Param (
    [Parameter (
      Position    = 1,
      Mandatory   = $true,
      HelpMessage = "Reference hashtable"
    )]
    [ValidateNotNullOrEmpty ()]
    # [System.Collections.Specialized.OrderedDictionary]
    $Reference,
    [Parameter (
      Position    = 2,
      Mandatory   = $true,
      HelpMessage = "Difference hashtable"
      )]
    [ValidateNotNullOrEmpty ()]
    # [System.Collections.Specialized.OrderedDictionary]
    $Difference
  )
  Begin {
    # Get global preference variables
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
    # Variables
    $Check = $true
  }
  Process {
    # Check that hashtables are of the same size
    if ($Reference.Count -ne $Difference.Count) {
      $Check = $false
    } else {
      # Loop through tables
      foreach ($Key in $Reference.Keys) {
        # Check that they contain the same keys
        if ($Difference.$Key) {
          # Check that they contain the same values
          if ($Difference.$Key -ne $Reference.$Key) {
            $Check = $false
            Write-Log -Type "DEBUG" -Message "$($Difference.$Key) does not exists in reference hashtable"
            break
          }
        } else {
          $Check = $false
          Write-Log -Type "DEBUG" -Message "$Key does not exists in difference hashtable"
          break
        }
      }
    }
    return $Check
  }
}