src/Organization/Set-XrmSettingValue.ps1

<#
    .SYNOPSIS
    Set environment or app setting value.

    .DESCRIPTION
    Call the SaveSettingValue SDK action to create or update a named setting at environment or app level.

    .PARAMETER XrmClient
    Xrm connector initialized to target instance. Use latest one by default. (Dataverse ServiceClient)

    .PARAMETER SettingName
    Unique name of the setting to set (e.g. "OverrideAppHeaderColor").

    .PARAMETER Value
    Value to assign to the setting.

    .PARAMETER AppUniqueName
    Unique name of the model-driven app this setting applies to. Omit for environment-level setting.

    .PARAMETER SolutionUniqueName
    Unique name of the solution to associate the change with. Optional.

    .OUTPUTS
    [System.Void]

    .EXAMPLE
    $xrmClient = New-XrmClient -ConnectionString $connectionString;
    $xrmClient | Set-XrmSettingValue -SettingName "OverrideAppHeaderColor" -Value "#FF0000";

    .EXAMPLE
    $xrmClient = New-XrmClient -ConnectionString $connectionString;
    $xrmClient | Set-XrmSettingValue -SettingName "OverrideAppHeaderColor" -Value "#FF0000" -AppUniqueName "msdyn_FieldService" -SolutionUniqueName "MySolution";

    .LINK
    https://github.com/AymericM78/PowerDataOps/blob/main/documentation/commands/Set-XrmSettingValue.md
#>

function Set-XrmSettingValue {
    [CmdletBinding()]
    [OutputType([System.Void])]
    param (
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]
        $SettingName,

        [Parameter(Mandatory = $true)]
        [ValidateNotNull()]
        [String]
        $Value,

        [Parameter(Mandatory = $false)]
        [String]
        $AppUniqueName,

        [Parameter(Mandatory = $false)]
        [String]
        $SolutionUniqueName
    )
    begin {
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }
    process {
        $request = New-XrmRequest -Name "SaveSettingValue";
        $request | Add-XrmRequestParameter -Name "SettingName" -Value $SettingName | Out-Null;
        $request | Add-XrmRequestParameter -Name "Value" -Value $Value | Out-Null;

        if ($PSBoundParameters.ContainsKey("AppUniqueName") -and $AppUniqueName) {
            $request | Add-XrmRequestParameter -Name "AppUniqueName" -Value $AppUniqueName | Out-Null;
        }

        if ($PSBoundParameters.ContainsKey("SolutionUniqueName") -and $SolutionUniqueName) {
            $request | Add-XrmRequestParameter -Name "SolutionUniqueName" -Value $SolutionUniqueName | Out-Null;
        }

        $XrmClient | Invoke-XrmRequest -Request $request;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }
}

Export-ModuleMember -Function Set-XrmSettingValue -Alias *;