functions/Get-PsLaArmParameter.ps1


<#
    .SYNOPSIS
        Get parameters from ARM template
         
    .DESCRIPTION
        Get parameters from the ARM template
         
        You can include / exclude parameters, so your parameter file only contains the parameters you want to handle at deployment
         
        The default value is promoted as the initial value of the parameter
         
    .PARAMETER Path
        Path to the ARM template that you want to work against
         
    .PARAMETER Exclude
        Instruct the cmdlet to exclude the given set of parameter names
         
        Supports array / list
         
    .PARAMETER Include
        Instruct the cmdlet to include the given set of parameter names
         
        Supports array / list
         
    .PARAMETER AsFile
        Instruct the cmdlet to save a valid ARM template parameter file next to the ARM template file
         
    .PARAMETER BlankValues
        Instructs the cmdlet to blank the values in the parameter file
         
    .PARAMETER CopyMetadata
        Instructs the cmdlet to copy over the metadata property from the original parameter in the ARM template, if present
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json"
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        The output is written to the console
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json" -Exclude "logicAppLocation","trigger_Frequency"
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        Will exclude the parameters "logicAppLocation" & "trigger_Frequency" if present
        The output is written to the console
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json" -Include "trigger_Interval","trigger_Frequency"
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        Will only copy over the parameters "trigger_Interval" & "trigger_Frequency" if present
        The output is written to the console
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json" -AsFile
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        The output is written the "C:\temp\work_directory\TestLogicApp.parameters.json" file
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json" -BlankValues
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        Blank all values for each parameter
        The output is written to the console
         
    .EXAMPLE
        PS C:\> Get-PsLaArmParameter -Path "C:\temp\work_directory\TestLogicApp.json" -CopyMetadata
         
        Gets all parameters from the "TestLogicApp.json" ARM template
        Copies over the metadata property from the original parameter, if present
        The output is written to the console
         
    .NOTES
         
        Author: Mötz Jensen (@Splaxi)
         
#>

function Get-PsLaArmParameter {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [PsfValidateScript('PSFramework.Validate.FSPath.File', ErrorString = 'PSFramework.Validate.FSPath.File')]
        [Alias('File')]
        [string] $Path,

        [string[]] $Exclude,

        [string[]] $Include,

        [switch] $AsFile,

        [switch] $BlankValues,

        [switch] $CopyMetadata
    )

    process {
        $armObj = [ArmTemplate]$(Get-TaskWorkObject -Path $Path)

        $res = [ordered]@{}
        $res.'$schema' = "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#"
        $res.contentVersion = "1.0.0.0"
        $res.parameters = [ordered]@{}
      
        foreach ($item in $armObj.parameters.PsObject.Properties) {
            if ($item.Name -in $Exclude) { continue }
        
            if ($Include.Count -gt 0) {
                if (-not ($item.Name -in $Include)) { continue }
            }
        
            $valueObj = [ordered]@{}

            if ($BlankValues) {
                switch ($item.Value.Type) {
                    "int" {
                        $valueObj.value = 0
                    }
                    "bool" {
                        $valueObj.value = $false
                    }
                    "object" {
                        $valueObj.value = $null
                    }
                    "array" {
                        $valueObj.value = @()
                    }
                    Default {
                        $valueObj.value = ""
                    }
                }
            }
            else {
                $valueObj.value = $item.Value.DefaultValue
            }

            if ($CopyMetadata -and $item.Value.metadata) {
                $valueObj.metadata = $item.Value.metadata
            }

            $res.parameters."$($item.Name)" = $valueObj
        }

        if ($AsFile) {
            $pathLocal = $Path.Replace(".json", ".parameters.json")

            $encoding = New-Object System.Text.UTF8Encoding($true)
            [System.IO.File]::WriteAllLines($pathLocal, $($([PSCustomObject] $res) | ConvertTo-Json -Depth 10), $encoding)

            Get-Item -Path $pathLocal | Select-Object -ExpandProperty FullName
        }
        else {
            $([PSCustomObject] $res) | ConvertTo-Json -Depth 10
        }
    }
}