CmdLets/Master/Initialize-Variables.ps1

Function Initialize-Variables 
 {
<#
.SYNOPSIS
    Initializes or updates global variables based on a provided configuration collection.
 
.DESCRIPTION
    The Initialize-Variables function iterates through an array or collection of variable definition objects.
    For each variable, it executes any defined pre-script blocks, resolves internal bracketed placeholder
    variables within its value, creates or updates the global variable in the session scope, and finally
    executes any defined post-script blocks.
 
.PARAMETER Variables
    A mandatory collection or array of variable configuration objects. Each object typically includes:
    - Name: The name of the variable to set or create.
    - Value: The value to assign (supports placeholder resolution).
    - PreScriptBlocks: Optional array of string-based script blocks to execute before variable assignment.
    - PostScriptBlocks: Optional array of string-based script blocks to execute after variable assignment.
 
.EXAMPLE
    $VarConfig = @(
        [PSCustomObject]@{
            Name = "InstallDir"
            Value = "C:\Apps"
            PreScriptBlocks = @()
            PostScriptBlocks = @()
        }
    )
    Initialize-Variables -Variables $VarConfig
     
    Description:
    Processes the configuration object, sets the global $InstallDir variable, and runs its post-script block.
 
.NOTES
    Prerequisites:
    - Depends on the Convert-PlaceholderVariables function being available in the current session.
    - Creates or modifies variables at the Global scope.
 
.LINK
    https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/set-variable
#>

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True)]$Variables
    )
    ForEach ($Variable in $Variables) {
        Write-Host "Processing Variable: $($Variable.Name)"
        ForEach ($ScriptBlock in $Variable.PreScriptBlocks) { 
            Write-Host $ScriptBlock
            Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
        }
        $Variable.Value = Convert-PlaceholderVariables -Value $Variable.Value -Variables $Variables
        if (Get-Variable -Name $Variable.Name -ErrorAction SilentlyContinue) {
            Write-Host "`tSetting Value: $($Variable.Value)"
            Set-Variable -Name $Variable.Name -Value $Variable.Value -Scope Global
        } else {
            Write-Host "`tCreating Value: $($Variable.Value)"
            New-Variable -Name $Variable.Name -Value $Variable.Value -Scope Global
        }
        ForEach ($ScriptBlock in $Variable.PostScriptBlocks) { 
            Write-Host $ScriptBlock
            Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
        }
    }

}