core/private/Get-JaxIncludedFiles.ps1

function Get-JaxIncludedFiles {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [string] $FilePath,
        [switch] $NoCache
    )

    $commonParams = Get-JaxCommonParameters -BoundParameters $PSBoundParameters
    Write-Debug "FUNC: $($MyInvocation.MyCommand.Name) Args: $($PSBoundParameters | ConvertTo-Json -Depth 1 -Compress -WarningAction SilentlyContinue)"

    if (-not (Test-Path -Path $FilePath -PathType Leaf)) {
        return @()
    }

    $included = @()
    $content = Get-Content -Path $FilePath -Raw -ErrorAction Stop
    $parent = Split-Path -Parent $FilePath

    $scriptAst = [System.Management.Automation.Language.Parser]::ParseInput($content, [ref]$null, [ref]$null)
    $commands = $scriptAst.FindAll({
            param($ast)
            $ast -is [System.Management.Automation.Language.CommandAst] -and
            $ast.CommandElements.Count -gt 1 -and
            $ast.CommandElements[0] -is [System.Management.Automation.Language.StringConstantExpressionAst] -and
            $ast.CommandElements[0].Value -ieq 'Include'
        }, $true)

    foreach ($command in $commands) {
        $argument = $command.CommandElements[1]
        $path = $null
        if ($argument -is [System.Management.Automation.Language.StringConstantExpressionAst]) {
            $path = $argument.Value
        } elseif ($argument -is [System.Management.Automation.Language.ExpandableStringExpressionAst] -and
                  $argument.Value -match '^\$PSScriptRoot[\\/]') {
            # `Include "$PSScriptRoot/tasks-x.ps1"` is the CORRECT way to write
            # an include — psake's own Include resolves a bare relative path
            # against the CURRENT DIRECTORY, so a literal breaks the moment a
            # nested env (env/<app>) includes a shared psakefile from
            # env/common. Skipping expandable strings meant discovery followed
            # only literals, so eight of the nine includes in env/common were
            # invisible here and their task parameters never reached the CLI.
            # Someone then wrote one include as a literal to make discovery see
            # it, which broke every nested env at runtime instead.
            #
            # $PSScriptRoot inside a script IS that script's directory, which is
            # exactly $parent, so this is a substitution rather than an eval.
            $path = $argument.Value -replace '^\$PSScriptRoot', $parent
        }
        if ($null -eq $path) {
            continue
        }
        if ([string]::IsNullOrWhiteSpace($path)) {
            continue
        }
        if (-not [System.IO.Path]::IsPathRooted($path)) {
            $path = Join-Path $parent $path
        }
        $path = [IO.Path]::GetFullPath($path)
        if ($included -notcontains $path) {
            $included += $path
        }
    }

    return $included
}