public/Remove-PSScriptInfo.ps1

<#PSScriptInfo
{
    "VERSION": "1.0.0.0",
    "GUID": "1d1a8e42-48bf-4c9f-9d62-e01484b5eb1a",
    "FILENAME": "Remove-PSScriptInfo.ps1",
    "AUTHOR": "Hannes Palmquist",
    "AUTHOREMAIL": "hannes.palmquist@outlook.com",
    "CREATEDDATE": "2021-03-28",
    "COMPANYNAME": "N/A",
    "COPYRIGHT": "© 2021, Hannes Palmquist, All Rights Reserved"
}
PSScriptInfo#>


function Remove-PSScriptInfo
{
    <#
    .DESCRIPTION
        Removes a PSScriptInfo block from a script file
    .PARAMETER FilePath
        Path to file where PSScriptInfo block should be removed
    .EXAMPLE
        Remove-PSScriptInfo -FilePath C:\Script\file.ps1
    #>


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

    PROCESS
    {

        # Read ast tokens from file
        try
        {
            New-Variable astTokens -Force -ErrorAction Stop
            New-Variable astErr -Force -ErrorAction Stop
            $null = [System.Management.Automation.Language.Parser]::ParseFile($FilePath, [ref]$astTokens, [ref]$astErr)
            Write-Verbose -Message 'Read file content'
        }
        catch
        {
            throw "Failed to read file content with error: $PSItem"
        }

        # Find PSScriptInfo comment token
        $PSScriptInfo = $astTokens.where{ $_.kind -eq 'comment' -and $_.text.Replace("`r", '').Split("`n")[0] -like '<#PSScriptInfo*' }
        Write-Verbose -Message 'Parsed powershell script file and extracted raw PSScriptInfoText'


        if (-not $PSScriptInfo)
        {
            throw 'No PSScriptInfo found in file'
        }

        $StartLine = $PSScriptInfo.extent.StartLineNumber
        $EndLine = $PSScriptInfo.extent.EndLineNumber

        # Read file
        try
        {
            $FileContent = Get-Content -Path $FilePath -ErrorAction Stop
            Write-Verbose -Message 'Collected file content'
        }
        catch
        {
            throw "Failed to read file content with error: $PSItem"
        }
        
        # Exclude PSScriptInfo
        $NewContent = @($FileContent | Select-Object -First ($StartLine - 1) -ErrorAction stop) + @($FileContent | Select-Object -Skip ($EndLine) -ErrorAction Stop)
        Write-Verbose -Message 'Concatinated content around removed PSScriptInfo'

        # Write content back to file
        try
        {
            $NewContent | Set-Content -Path $FilePath -ErrorAction Stop
            Write-Verbose -Message 'Wrote content to back to file'
        }
        catch
        {
            throw "Failed to write content back to file with error: $PSItem"
        }

        return ([pscustomobject]@{
                StartLine   = $StartLine
                EndLine     = $EndLine
                StartOffset = $PSScriptInfo.extent.StartOffset
                EndOffset   = $PSScriptInfo.extent.EndOffset
            })

    }
}
#endregion