Set-Tokens.ps1

#Set-StrictMode -Version Latest
#####################################################
# Set-Tokens
#####################################################
<#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 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 }
    Write-Verbose "$PSScriptRoot\$PSScriptName $source $destination called by:$PSCallingScript"

    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
            if ($token -like '$(*') {
                $token = $token.Remove(0,2) 
                $token = $token.Substring(0, $token.Length - 1)
            }
            $value = [System.Environment]::GetEnvironmentVariable($token)
            $results = $string.replace($org,$value)
        }
        return $results
    }

    if (!$source) { $source = Get-Location }
    if (-not (Test-Path $source)) {
        $results = Set-TokenContent $source
    }
    Get-ChildItem â€“Path $source -recurse | Foreach-Object {
        $path = $_.FullName
        $content = (Get-Content $path)
        $string = Set-TokenContent $content
        if ($destination) {
            if ($destination.IndexOf('.') -gt -1) {
                $string | Out-File $destination
            } else {
                Write-Verbose "path:$path"
                Write-Verbose "source:$source"            
                if ($path.EndsWith($source)) { $destination = $path.Replace($source, "$destination\$source") }
                Write-Verbose "destination:$destination"
                $parent = Split-Path $destination -Parent
                if (-not (Test-Path $parent)) {New-Item -Path $parent -ItemType Directory | Out-Null}
                $string | Out-File $destination
            }
        } else {
            $string | Out-File $path #.replace('.json','-new.json')
        }

        $results = $path
    }    
    Write-Verbose "$PSScriptName $path end"
    return $results
}