public/Get-InstalledPackage.ps1

# Returns the packages that are installed.
function Get-InstalledPackage {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSReviewUnusedParameter', '', Justification='Version may not always be used, but are still required')]
    [CmdletBinding()]
    param (
        [Parameter()]
        [string]
        $Name,

        [Parameter()]
        [string]
        $RequiredVersion,

        [Parameter()]
        [string]
        $MinimumVersion,

        [Parameter()]
        [string]
        $MaximumVersion
    )

    Write-Debug ($LocalizedData.ProviderDebugMessage -f ('Get-InstalledPackage'))

    # If a user wants to check whether the latest version is installed, first check the repo for what the latest version is
    if ($RequiredVersion -eq 'latest') {
        $RequiredVersion = $(Find-ChocoPackage -Name $Name).Version
    }

    $chocoParams = @{
        LocalOnly = $true
        AllVersions = $true
    }

    # If a user provides a name without a wildcard, include it in the search
    # This provides wildcard search behavior for locally installed packages, which Chocolatey lacks
    if ($Name -And -Not ([WildcardPattern]::ContainsWildcardCharacters($Name))) {
        $chocoParams.Add('Name',$Name)
    }

    # Convert the PSCustomObject output from Foil into PackageManagement SWIDs, then filter results by any name and version requirements
    # We apply additional package name filtering when using wildcards to make Chocolatey's wildcard behavior more PowerShell-esque
    Foil\Get-ChocoPackage @chocoParams | ConvertTo-SoftwareIdentity |
        Where-Object {-Not $Name -Or ($_.Name -Like $Name)} |
            Where-Object {Test-PackageVersion -Package $_ -RequiredVersion $RequiredVersion -MinimumVersion $MinimumVersion -MaximumVersion $MaximumVersion}
}