functions/parsing/Read-JeaScriptFile.ps1

function Read-JeaScriptFile
{
<#
    .SYNOPSIS
        Parses scriptfiles and returns qualified command objects of commands found.
     
    .DESCRIPTION
        Parses scriptfiles and returns qualified command objects of commands found.
     
        Note:
        The IsDangerous property is a best-effort thing.
        We TRY to find all dangerous commands, that might allow the user to escalate permissions on the Jea Endpoint.
        There is no guarantee for complete success however.
     
    .PARAMETER Path
        The path to scan.
        Will ignore folders, does not discriminate by extension.
     
    .PARAMETER EnableException
        This parameters disables user-friendly warnings and enables the throwing of exceptions.
        This is less user friendly, but allows catching exceptions in calling scripts.
     
    .EXAMPLE
        PS C:\> Get-ChildItem . -Filter *.ps1 -Recurse | Read-JeaScriptFile
     
        Scans all powershell script files in the folder and subfolder, then parses out command tokens.
#>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('FullName')]
        [string]
        $Path,
        
        [switch]
        $EnableException
    )
    
    begin
    {
        Write-PSFMessage -Level InternalComment -Message "Bound parameters: $($PSBoundParameters.Keys -join ", ")" -Tag 'debug', 'start', 'param'
        $filesProcessed = @()
    }
    process
    {
        foreach ($pathItem in $Path)
        {
            Write-PSFMessage -Level Verbose -Message "Processing $pathItem" -Target $pathItem
            try { $resolvedPaths = Resolve-PSFPath -Path $pathItem -Provider FileSystem }
            catch { Stop-PSFFunction -Message "Unable to resolve path: $pathItem" -Target $pathItem -EnableException $EnableException -Continue }
            foreach ($resolvedPath in $resolvedPaths)
            {
                $pathObject = Get-Item $resolvedPath
                
                if ($filesProcessed -contains $pathObject.FullName) { continue }
                if ($pathObject.PSIsContainer) { continue }
                
                $filesProcessed += $pathObject.FullName
                $commands = (Read-Script -Path $pathObject.FullName).Tokens | Where-Object TokenFlags -like "*CommandName*" | Group-Object Text | Select-Object -ExpandProperty Name | Where-Object { $_ }
                Write-PSFMessage -Level Verbose -Message "$($commands.Count) different commands found" -Target $pathItem
                    
                if ($commands) { Get-CommandMetaData -CommandName $commands -File $pathObject.FullName }
            }
        }
    }
}