private/Get-PhpExtensionDetail.ps1

function Get-PhpExtensionDetail
{
    <#
    .Synopsis
    Inspects files containing PHP extensions.
 
    .Parameter PhpVersion
    The instance of PhpVersionInstalled for which you want to inspect the extension(s).
    It can be omitted.
 
    .Parameter Path
    The path of the PHP extension file, or a directory with possible extension files.
    If omitted we'll inspect all the extensions in the extension directory of PhpVersionInstalled.
 
    .Outputs
    System.Array|PSObject
 
    .Example
    Get-PhpExtensionDetail -PhpVersion $phpVersion -Path 'C:\Dev\PHP\ext\php_ext.dll'
    #>

    [OutputType([psobject])]
    [OutputType([psobject[]])]
    param (
        [Parameter(Mandatory = $false, Position = 0, HelpMessage = 'The instance of PhpVersion for which you want to inspect the extension(s). If omitted you have to specify the -Path parameter.')]
        [PhpVersionInstalled]$PhpVersion,
        [Parameter(Mandatory = $false, Position = 1, HelpMessage = 'The path of the PHP extension file, or a directory with possible extension files; if omitted we''ll inspect all the extensions in the extension directory of PhpVersion')]
        [ValidateNotNull()]
        [ValidateLength(1, [int]::MaxValue)]
        [string]$Path
    )
    begin {
        $result = $null
    }
    process {
        $inspectorParameters = @()
        if ($null -ne $Path -and $Path -ne '' -and (Test-Path -Path $Path -PathType Leaf)) {
            $result = $null
            $inspectingSingleFile = $true
            $inspectorParameters += $Path
            $somethingToInspect = $true
        } elseif ($null -eq $PhpVersion) {
            throw "Both -PhpVersion and -Path parameters are empty, or -PhpVersion is empty and -Path is not the path of a file"
        } else {
            $result = @()
            $inspectingSingleFile = $false
            if ($null -eq $Path -or $Path -eq '') {
                $folder = $PhpVersion.ExtensionsPath
            } else {
                $folder = $Path
                if (-Not(Test-Path -Path $folder -PathType Container)) {
                    throw "Unable to find the file/folder $folder"
                }
            }
            if (Test-Path -Path $folder -PathType Container) {
                $subFiles = Get-ChildItem -Path $folder -Filter '*.dll' | Select-Object -ExpandProperty 'FullName'
                $somethingToInspect = $subFiles.Count -gt 0
                if ($somethingToInspect) {
                    $inspectorParameters += $subFiles
                }
            } else {
                $somethingToInspect = $false
            }
        }
        if ($somethingToInspect) {
            $rxGood = '^'
            $rxGood += 'api:(?<apiVersion>\d+)'
            $rxGood += '\t';
            $rxGood += 'architecture:(?<architecture>'
            if ($null -eq $PhpVersion) {
                $checkArchitectures = @($Script:ARCHITECTURE_32BITS, $Script:ARCHITECTURE_64BITS)
                $rxGood += $Script:ARCHITECTURE_32BITS + '|' + $Script:ARCHITECTURE_64BITS
            } else {
                $checkArchitectures = @($PhpVersion.Architecture)
                $rxGood += $PhpVersion.Architecture
            }
            $rxGood += ')'
            $rxGood += '\t';
            $rxGood += 'threadSafe:(?<threadSafe>(?:'
            if ($null -eq $PhpVersion) {
                $rxGood += '0|1'
            } else {
                $rxGood += [int]$PhpVersion.ThreadSafe
            }
            $rxGood += ')?)'
            $rxGood += '\t';
            $rxGood += 'type:(?<type>Php|Zend)'
            $rxGood += '\t';
            $rxGood += 'name:(?<name>.+)'
            $rxGood += '\t';
            $rxGood += 'version:(?<version>.*)'
            $rxGood += '\t';
            $rxGood += 'filename:(?<filename>.+)'
            $rxGood += '$'
            foreach ($checkArchitecture in $checkArchitectures) {
                $inspectorPath = [System.IO.Path]::Combine($PSScriptRoot, 'bin', 'Inspect-PhpExtension-' + $checkArchitecture + '.exe')
                $inspectorResults = & $inspectorPath $inspectorParameters
                if ($inspectorResults -ne 'Unable to open the DLL.') {
                    if ($LASTEXITCODE -eq 0) {
                        break
                    }
                    throw 'Failed to inspect extension(s)'
                }
            }
            foreach ($inspectorResult in $inspectorResults) {
                $match = $inspectorResult | Select-String -Pattern $rxGood
                if (-Not($match)) {
                    if ($inspectingSingleFile) {
                        throw "Failed to inspect extension: $inspectorResult`n$rxGood"
                    }
                } else {
                    $groups = $match.Matches[0].Groups
                    $apiVersion = $groups['apiVersion'].Value
                    if ($null -ne $PhpVersion -and $apiVersion -ne '0' -and $apiVersion -ne $PhpVersion.ApiVersion) {
                        if ($inspectingSingleFile) {
                            throw "The extension uses API $apiVersion whereas PHP uses API $($PhpVersion.ApiVersion)"
                        }
                    } else {
                        $result1 = [PhpExtension]::new(@{
                            'Type' = $groups['type'].Value;
                            'State' = $Script:EXTENSIONSTATE_UNKNOWN;
                            'Name' = $groups['name'].Value;
                            'Handle' = Get-PhpExtensionHandle -Name $groups['name'].Value;
                            'Version' = $groups['version'].Value;
                            'Filename' = $groups['filename'].Value;
                            'ApiVersion' = $apiVersion;
                            'PhpVersion' = Get-PhpVersionFromApiVersion -ApiVersion $groups['apiVersion'].Value;
                            'Architecture' = $groups['architecture'].Value;
                            'ThreadSafe' = $groups['threadSafe'].Value;
                        })
                        if ($inspectingSingleFile) {
                            $result = $result1;
                        } else {
                            $result += $result1;
                        }
                    }
                }
            }
        }
    }
    end {
        $result
    }
}