CmdLets/Sync-LibraryApplicationRegistry.ps1

Function Sync-LibraryApplicationRegistry 
 {

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,ValueFromPipeline=$True)]
            [ValidateNotNullOrEmpty()]
            $Application
    )
    Begin {}
    Process{
        ForEach ($RegistrySetting in $Application.Registry) {
            Write-Progress -ID 0 -Activity "Syncing Registry Settings" -Status "Syncing: $($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 
            }
            Write-host $RegistrySetting.Name
            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{
        Write-Progress -ID 0 -Activity "Syncing Registry Settings" -Completed
    }

}