private/Get-PSScriptInfoLegacy.ps1

<#PSScriptInfo
    .VERSION 1.0.0.0
    .GUID dd14abf0-8b1b-425f-9498-8dfaf657ae9f
    .FILENAME Get-PSScriptInfoLegacy.ps1
    .AUTHOR Hannes Palmquist
    .AUTHOREMAIL hannes.palmquist@outlook.com
    .CREATEDDATE 2019-09-23
    .COMPANYNAME N/A
    .COPYRIGHT (c) 2019, Hannes Palmquist, All Rights Reserved
#>


function Get-PSScriptInfoLegacy
{
    <#
      .DESCRIPTION
        Collect and parse psscriptinfo from file
      .PARAMETER FilePath
        Defines the path to the file from which to get psscriptinfo from.
      .EXAMPLE
        Get-PSScriptInfoLegacy -FilePath C:\temp\file.ps1
        Description of example
    #>


    [CmdletBinding()] # Enabled advanced function support
    param(
        [ValidateScript( { Test-Path -Path $_ -PathType Leaf })][Parameter(Mandatory)][string]$FilePath
    )

    PROCESS
    {
        try
        {
            $PSScriptInfo = [ordered]@{ }
            New-Variable astTokens -Force
            New-Variable astErr -Force
            $null = [System.Management.Automation.Language.Parser]::ParseFile($FilePath, [ref]$astTokens, [ref]$astErr)
            $FileContent = $astTokens.where{ $_.kind -eq 'comment' -and $_.text.Replace("`r", '').Split("`n")[0] -like '<#PSScriptInfo*' } | Select-Object -expand text
            $FileContent = $FileContent.Replace("`r", '').Split("`n")
            if ($FileContent)
            {
                $FileContent | Select-Object -Skip 1 | ForEach-Object {
                    $CurrentRow = $PSItem
                    if ($CurrentRow.Trim() -like '.*')
                    {
                        # New attribute found, extract attribute name
                        $Attribute = $CurrentRow.Split('.')[1].Split(' ')[0]

                        # Check if row has value
                        if ($CurrentRow.Trim().Replace($Attribute, '').TrimStart('.').Trim().Length -gt 0)
                        {

                            # Value on same row
                            $Value = $CurrentRow.Trim().Split(' ', 2)[1].Trim()

                            # String Arrays
                            if (@() -contains $Attribute)
                            {
                                $Value = $Value.Split(',').Trim()
                            }
                            # Datetime
                            if (@('CREATEDDATE' -contains $Attribute))
                            {
                                $Value = $Value -as [string]
                            }
                            # System version
                            if (@('VERSION' -contains $Attribute))
                            {
                                $Value = $Value -as [string]
                            }
                            # guid
                            if (@('GUID' -contains $Attribute))
                            {
                                $Value = $Value -as [guid]
                            }

                            if (@('UNITTEST' -contains $Attribute))
                            {
                                if ($Value -eq 'false')
                                {
                                    $Value = $false
                                }
                                elseif ($Value -eq 'true')
                                {
                                    $Value = $true
                                }
                                else
                                {
                                    $Value = $null
                                }
                            }

                            # Add attribute and value to PSScriptInfo
                            $null = $PSScriptInfo.Add($Attribute, $Value)
                        }
                        else
                        {
                            # If no value is provided populate PSScriptInfo with attribute and an empty collection as value
                            $null = $PSScriptInfo.Add($Attribute, [collections.arraylist]::New())
                        }
                    }
                    elseif ($CurrentRow -notlike '*#>*')
                    {
                        # If row is not an attribute and PSScriptInfo is not terminated add row as value in attribute collection
                        $null = $PSScriptInfo.$Attribute.Add($CurrentRow.Trim())
                    }

                }
                Write-Output ([pscustomobject]$PSScriptInfo)
            }
            else
            {
                Write-Error -Message 'No valid PSScriptInfo was found in file'
            }
        }
        catch
        {
            Write-Error -Message 'No valid PSScriptInfo was found in file' -ErrorRecord $_
        }
    }
}
#endregion