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 } } } |