Expand-TokenString.ps1

#Set-StrictMode -Version Latest
#####################################################
# Expand-TokenString
#####################################################
<#PSScriptInfo
 
.VERSION 0.1
 
.GUID bfd55243-60dd-4394-a80e-835718187e1f
 
.AUTHOR David Walker, Sitecore Dave, Radical Dave
 
.COMPANYNAME David Walker, Sitecore Dave, Radical Dave
 
.COPYRIGHT David Walker, Sitecore Dave, Radical Dave
 
.TAGS powershell token regex
 
.LICENSEURI https://github.com/Radical-Dave/Expand-TokenString/blob/main/LICENSE
 
.PROJECTURI https://github.com/Radical-Dave/Expand-TokenString
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
#>


<#
 
.DESCRIPTION
 PowerShell Script to expand tokens in file/folder/strings using RegEx, EnvVar EnvironmentVariables, .env files and .with $(envVar)
 
.PARAMETER data
String to replace tokens in
 
.PARAMETER values
Tokens for replacements - default EnvironmentVariable
 
.PARAMETER regex
Regex pattern for finding tokens - default to powershell format: $(name)
#>

[OutputType('System.String')]
[CmdletBinding(SupportsShouldProcess)]
Param(
    [Parameter(Mandatory=$false)][string]$data,
    [Parameter(Mandatory=$false)][hashtable]$tokens,
    [Parameter(Mandatory=$false)][string]$regex = '(\$\()([a-zA-Z0-9\.\-_]*)(\))'
)
process {
    if (!$data) { return $data }
    if (!$tokens) { $tokens = @{} }
    #if ($data.GetType() -ne 'Array') {Write-Verbose "wow:$($data.GetType())"}
    $results = $data
    $hits = [regex]::Matches($results,$regex)
    if (!$hits) {    return $results }
    #$tokensfound = @{}
    $hits | Foreach-Object {
        $org = $_.groups[0].value
        $token = $org
        if ($token -like '$(*') {
            $token = $token.Remove(0,2)
            $token = $token.Substring(0, $token.Length - 1)
        }
        if ($tokens) {
            $value = $tokens[$token]
        }
        if (!$value) {$value = [System.Environment]::GetEnvironmentVariable($token)}
        #$tokensfound[$token] = $value
        $results = $results.Replace($org,"$value")
    }
    #Write-Verbose "Tokens updated:"
    #$tokensfound.keys.foreach({
        #Write-Verbose "$($_):$($tokensfound[$_])"
    #})
    return $results
}