Public/Replace-SpecRegistryKey.ps1

# This is a helper function that uses new-specregistrykey with set-specregistryvalue to replace a registry key and all of its values.
Function Replace-SpecRegistryKey {
    <#
    .SYNOPSIS
    This function replaces or creates a registry key with the specified path, value name, data, and value type.
 
    .DESCRIPTION
    The Replace-SpecRegistryKey function checks if the specified registry key exists. If it does, the function updates the key with the provided data. If the key does not exist, it creates a new registry key with the specified path, value name, data, and value type.
 
    .PARAMETER KeyPath
    Specifies the registry path where the key should be located or created.
 
    .PARAMETER ValueName
    Specifies the name of the registry value to be updated or created.
 
    .PARAMETER ValueData
    Specifies the data to be set for the registry value.
 
    .PARAMETER ValueType
    Specifies the data type of the registry value. Valid values are 'String' and 'DWord'.
 
    .EXAMPLE
    Replace-SpecRegistryKey -KeyPath "HKLM:\Software\Example" -ValueName "SampleValue" -ValueData "TestData" -ValueType "String"
    Updates or creates a registry key "SampleValue" with data "TestData" of type String under the path "HKLM:\Software\Example".
 
    .EXAMPLE
    Replace-SpecRegistryKey -KeyPath "HKLM:\Software\Example" -ValueName "SampleValue" -ValueData 123 -ValueType "DWord"
    Updates or creates a registry key "SampleValue" with data 123 of type DWord under the path "HKLM:\Software\Example".
 
    .NOTES
    Author : owen.heaume
    Version : 1.0
    #>

    [cmdletbinding()]

    param (
        [Parameter (mandatory = $true)]
        [string]$KeyPath,

        [Parameter (mandatory = $true)]
        [string]$ValueName,

        [Parameter (mandatory = $true)]
        [string]$ValueData,

        [Parameter (mandatory = $true)]
        [ValidateSet('String', 'DWord')]
        [string]$ValueType
    )

    # If any part of the reg path doesn't exist at all, this will create it (New-Spec...), if the value name already exists, it just updates (Set-Spec...)
    try {
        write-verbose "Attempting to update the registry key $KeyPath $ValueName $ValueData $ValueType"
        if (Get-ItemProperty -Path $KeyPath -Name $ValueName -ErrorAction SilentlyContinue) {
            $null = Set-SpecRegistryKey -KeyPath $KeyPath -ValueName $ValueName -ValueType $ValueType -ValueData $ValueData
            write-verbose "Successfully updated the registry key"
            return 110
        } else {
            $null = New-SpecRegistryKey -KeyPath $keypath -ValueName $ValueName -ValueType $ValueType -ValueData $ValueData
            write-verbose "Successfully created the registry key"
            return 111
        }
    } catch {
        write-warning "Unable to update the registry key"
        return 1
    }
}