Private/Invoke-DatabaseScript.ps1

function Invoke-DatabaseScript {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        $Script,
        [string]$ResourcesPath,
        [Parameter(Mandatory=$true)]
        [string]$DatabaseServer,
        [string]$DatabaseName,
        [string]$DatabaseUserName,
        [string]$DatabasePassword,
        [hashtable]$variables
    )

    if (Test-Path $(Join-Path $ResourcesPath -ChildPath $Script.file))
    {
        $variables.GetEnumerator() | % { Set-Variable -Name $_.Key -Value $_.Value }

        Write-Host "Executing $($Script.file)..."
        $scriptContent = Get-Content $(Join-Path $ResourcesPath -ChildPath $Script.file) -Raw
        foreach ($textVariable in $Script.variables.text)
        {
            $members = $textVariable | Get-Member -View Extended
            foreach ($member in $members)
            {
                Write-Debug "Property: $($member.Name)"
                Write-Debug "Value: $($textVariable.$($member.Name))"
                $value = $ExecutionContext.InvokeCommand.ExpandString("$($textVariable.$($member.Name))")
                $scriptContent = $scriptContent.Replace($member.Name, $value)
            }
            Write-Debug $scriptContent
        }

        $sqlcommandVariables = @()
        foreach ($sqlcommandVariable in $Script.variables.sqlcommand)
        {
            $members = $sqlcommandVariable | Get-Member -View Extended
            foreach ($member in $members)
            {
                Write-Debug "Property: $($member.Name)"
                Write-Debug "Value: $($sqlcommandVariable.$($member.Name))"
                $sqlcommandVariables += "$($member.Name)=$ExecutionContext.InvokeCommand.ExpandString($($sqlcommandVariable.$($member.Name))"
            }
        }

        Invoke-Sqlcmd -Database $DatabaseName -ServerInstance $DatabaseServer -Username $DatabaseUserName -Password $DatabasePassword -OutputSqlErrors $true -Query $scriptContent -Variable $sqlcommandVariables
    }
}