CmdLets/Library/Sync-LibraryApplicationRegistry.ps1

Function Sync-LibraryApplicationRegistry 
 {

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,ValueFromPipeline=$True)]
            [ValidateNotNullOrEmpty()]
            $Application
    )
    Begin {}
    Process{
        ForEach ($Item in $Application) {
            Write-Host "Syncing Application: $($Item.Name)"
            ForEach ($RegistrySetting in $Item.Registry) {
                Write-Host "`tSyncing: $($RegistrySetting.Name)"
                ForEach ($ScriptBlock in $RegistrySettings.PreScriptBlocks) { 
                    Write-Verbose "Executing: $Scriptblock"
                    Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope 
                }

                ForEach ($Property in @("Path","Name","Value","Type")) {
                    If ($Property -notIn $RegistrySetting.psobject.Properties.Name) {
                        Throw "Property $Property not found"
                    } elseIf ($null -eq ($RegistrySetting.psobject.Properties | Where-Object { $_.Name -eq $Property }).Value){
                        Throw "Property $Property is null"
                    }
                }

                if (!(Test-Path $RegistrySetting.Path )) {
                    New-ItemWrapper $RegistrySetting.Path 
                }

                If ((Get-Item $RegistrySetting.Path).Property -Contains $RegistrySetting.Name) {
                    Set-ItemProperty `
                        -Path $RegistrySetting.Path `
                        -Name $RegistrySetting.Name `
                        -Value $RegistrySetting.Value
                } else {
                    New-ItemProperty `
                        -Path $RegistrySetting.Path `
                        -Name $RegistrySetting.Name `
                        -Value $RegistrySetting.Value `
                        -PropertyType $RegistrySetting.Type | out-null
                }

                ForEach ($ScriptBlock in $RegistrySettings.PostScriptBlocks) { 
                    Write-Verbose "Executing: $Scriptblock"
                    Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope 
                }
            }
        }
    }
    End{

    }

}