CmdLets/Sync-RegistrySettings.ps1

Function Sync-RegistrySettings 
 {

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$False)]
            $RegistrySettings
    )

    ForEach ($RegistrySetting in $RegistrySettings) {
        $i++; Write-Progress -ID 0 -Activity "Synching Registry Settings" -Status "Syncing: $($RegistrySetting.Name)" -PercentComplete (($i/$RegistrySettings.Count)*100);
        Write-Host "Syncing: $($RegistrySetting.Name)"

        ForEach ($ScriptBlock in $RegistrySettings.PreScriptBlocks) { 
            Write-Verbose $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 $ScriptBlock
            Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
        }
    }
    Write-Progress -ID 0 -Activity "Synching Registry Settings"  -Completed


}