Set-Tokens.ps1

#Set-StrictMode -Version Latest
#####################################################
# Set-Tokens
#####################################################
<#PSScriptInfo
 
.VERSION 0.6
 
.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 sitecore package
 
.LICENSEURI https://github.com/SharedSitecore/Set-Tokens/blob/main/LICENSE
 
.PROJECTURI https://github.com/SharedSitecore/Set-Tokens
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
 
#>


<#
 
.DESCRIPTION
 PowerShell Script to set/replace tokens in strings and files
 
.PARAMETER name
Path of package
 
#>
 
#####################################################
# Set-Tokens
#####################################################

[CmdletBinding(SupportsShouldProcess)]
Param(
    [Parameter(Mandatory=$false)]
    [string] $source,
    [Parameter(Mandatory=$false)]
    [string] $destination,
    [Parameter(Mandatory=$false)]
    [string] $regex = '(\$\()([a-zA-Z0-9\.\-_]*)(\))'
)
begin {
    $ProgressPreference = "SilentlyContinue"        
    $ErrorActionPreference = 'Stop'
    $PSScriptName = ($MyInvocation.MyCommand.Name.Replace(".ps1",""))
    $PSCallingScript = if ($MyInvocation.PSCommandPath) { $MyInvocation.PSCommandPath | Split-Path -Parent } else { $null }
    $currLocation = "$(Get-Location)"
    Write-Verbose "$PSScriptRoot\$PSScriptName $source $destination called by:$PSCallingScript from $currLocation"

    function Set-TokenContent($string) {
        if (!$string) { return $string }
        $results = $string
        $tokens = [regex]::Matches($string,$regex)
        if (!$tokens) {
            return $string
        }
        $tokens | Foreach-Object {            
            $org = $_.groups[0].value
            $token = $org
            #Write-Verbose "token:$token"
            if ($token -like '$(*') {
                $token = $token.Remove(0,2) 
                $token = $token.Substring(0, $token.Length - 1)
            }
            $value = [System.Environment]::GetEnvironmentVariable($token)
            #Write-Verbose "Set-TokenContent:$token=$value"
            $results = $results.replace($org,$value)
        }
        return $results
    }
 
    if (!$source) { $source = "$currLocation\*.json" }
    #Write-Verbose "source:$source"

    @((Split-Path $profile -Parent),$PSScriptRoot,("$currLocation" -ne "$PSScriptRoot" ? $currLocation : ''),(Split-Path $source -Parent)