<#
.SYNOPSIS
    This script will help to create expressions for logging the input values of a PowerShell script.
.DESCRIPTION
    This script will help to create expressions for logging the input values of a PowerShell script.
.EXAMPLE
    PS C:\> .\Build-ParamLog.ps1 -Script C:\Test.PS1 -Prefix Log

    Above execution will create expressions with prefix Log, see below.

    Log "[string]:UserName : $UserName"
    Log "[string]:DomainName : $DomainName"
    Log "[int]:OtherParameter : $OtherParameter"

.EXAMPLE
    PS C:\> .\Build-ParamLog.ps1 -Script C:\Test.PS1 -Prefix Log -icm

    Above execution will create expressions with prefix Log including CommonParameters, see below.

    Log "[string]:UserName : $UserName"
    Log "[string]:DomainName : $DomainName"
    Log "[int]:OtherParameter : $OtherParameter"
    Log "[System.Management.Automation.ActionPreference]:ErrorAction : $ErrorAction"
    Log "[System.Management.Automation.ActionPreference]:WarningAction : $WarningAction"
    Log "[System.Management.Automation.ActionPreference]:InformationAction : $InformationAction"
    Log "[switch]:Verbose : $Verbose"
    Log "[switch]:Debug : $Debug"
    Log "[string]:ErrorVariable : $ErrorVariable"
    Log "[string]:WarningVariable : $WarningVariable"
    Log "[string]:InformationVariable : $InformationVariable"
    Log "[string]:OutVariable : $OutVariable"
    Log "[int]:OutBuffer : $OutBuffer"
    Log "[string]:PipelineVariable : $PipelineVariable"
    
    .EXAMPLE
    PS C:\> .\Build-ParamLog.ps1 -Script C:\Test.PS1 

    Above execution will create expressions with default prefix Write-Output, see below.
    
    Write-Output "[string]:UserName : $UserName"
    Write-Output "[string]:DomainName : $DomainName"
    Write-Output "[int]:OtherParameter : $OtherParameter"

.NOTES
    Supports PowerShell 3.0,4.0,5.0,5.1 and 6.x versions
#>

#requires -version 3.0

[alias('gpl')]
param(
    #Script path to build parameter log expression
    [Parameter(Mandatory = $true)]
    [String]$Script,

    #Prefix for each parameter expression output
    [String]$Prefix = 'Write-Output',

    #If mentioned, CommonParameters will be included in the output
    [Alias('icm')]
    [Switch]$IncludeCommonParameters
)

    If([IO.Path]::GetExtension($Script) -ne '.ps1' ){
        Throw "$Script is not a PowerShell script, please provide a PowerShel script."
    }

    If( -not (Test-Path -Path $Script)){
        Throw "Unable to locate ,make sure $Script is available"
    }

    $Command = Get-Command -Name $Script
    if( $IncludeCommonParameters.IsPresent ){
        $FilteredList = $Command.Parameters.Values
    }
    else{
        $FilteredList = $Command.Parameters.Values | Where-Object -FilterScript {$_.Name -notin [System.Management.Automation.Cmdlet]::CommonParameters}
    }
    
    $FilteredList | ForEach-Object -Process { "$Prefix `"[$($_.ParameterType)]:$($_.Name) : $('$' + $($_.Name))`"" }