Public/Get-Instance.ps1

function Get-Instance {

    <#
 
    .SYNOPSIS
    Gets SQL Server LocalDB instance details.
 
    .DESCRIPTION
    Lists available LocalDB instances or gets details for one named instance.
    Each result contains the instance name, SQL Server version as a System.Version
    value when available, and the named pipe when available. Use Version to
    filter by a version prefix. Requires SQL Server LocalDB to be installed.
 
    .EXAMPLE
    PS> Import-Module PsSqlLocalDb
    PS> Get-LocalDbInstance -Name 'MSSQLLocalDB'
 
    Gets details for the MSSQLLocalDB instance. Requires SQL Server LocalDB to
    be installed.
    Example output is abbreviated and illustrative; the version and pipe name
    vary by machine.
 
    Name Version NamedPipe
    ---- ------- ---------
    MSSQLLocalDB 15.0.4153.1 machine-specific
 
    .OUTPUTS
    PSCustomObject
    An instance with Name, Version, and NamedPipe properties.
 
    .LINK
    https://abbgrade.github.io/PsSqlLocalDb/docs/Get-LocalDbInstance.html
 
    .LINK
    https://learn.microsoft.com/en-us/sql/tools/sqllocaldb-utility
 
    #>


    [CmdletBinding( DefaultParameterSetName = 'All' )]
    param (
        # Gets details for this named instance. If omitted, lists all instances.
        [Parameter( ParameterSetName = 'Single' )]
        [ValidateNotNullOrEmpty()]
        [string] $Name,

        # Filters results by a SQL Server version prefix, such as '15.0'.
        [Parameter()]
        [string] $Version
    )

    process {
        if ($PSCmdlet.ParameterSetName -eq 'All') {
            Write-Verbose 'Get sqllocaldb instances.'
            $result = Invoke-SqlLocalDb -ArgumentList @('info')
            if (-not $result.Succeeded) {
                Write-SqlLocalDbError -Message 'Failed to list LocalDB instances.' -Details $result.Error
                return
            }

            foreach ($instanceName in $result.Output | ForEach-Object { "$_".Trim() } | Where-Object { $_ }) {
                Get-Instance -Name $instanceName -Version:$Version
            }
            return
        }

        Write-Verbose "Get sqllocaldb instance $Name."
        $result = Invoke-SqlLocalDb -ArgumentList @('info', $Name)
        if (-not $result.Succeeded) {
            Write-SqlLocalDbError -Message "Failed to get info for LocalDB instance '$Name'." -Details $result.Error
            return
        }

        $instanceData = ConvertFrom-SqlLocalDbInstanceInfo -Output $result.Output

        if (-not $instanceData.Name) {
            Write-Warning "'sqllocaldb info' did not return an instance with name $Name"
            $instanceData.Name = $Name
        }
        else {
            Write-Verbose "Found LocalDb instance $($instanceData.Name)."
        }

        $instance = [PSCustomObject]@{
            Name      = $instanceData.Name
            Version   = $null
            NamedPipe = $instanceData.NamedPipe
        }

        if ($instanceData.Version) {
            $parsedVersion = [version]::MinValue
            if ([version]::TryParse($instanceData.Version, [ref]$parsedVersion)) {
                $instance.Version = $parsedVersion
                Write-Verbose "Found LocalDb version $($instance.Version)."
            }
            else {
                Write-Warning "'sqllocaldb info' returned an invalid version '$($instanceData.Version)' for $Name"
            }
        }
        else {
            Write-Warning "'sqllocaldb info' did not return an instance version for $Name"
        }

        if (-not $Version -or (Test-SqlLocalDbVersionPrefix -Version $instance.Version -Prefix $Version)) {
            $instance
        }
    }
}