public/Select-SqlPackageVersion.ps1

function Select-SqlPackageVersion {
<#
    .SYNOPSIS
    Selects (finds) a specific version of SqlPackage.exe to use in subsequent commands.
 
    .DESCRIPTION
    Selects (finds) a specific version of SqlPackage.exe to use in subsequent commands.
 
    For information on SqlPackage.exe see https://docs.microsoft.com/en-us/sql/tools/sqlpackage
 
    .PARAMETER PreferredVersion
    Defines the preferred version of SqlPackage.exe you wish to find. Use 'latest' for the latest version, or do not provide the parameter.
    Valid values for -Version are: ('15', '14', '13', '12', '11') which translate as follows:
 
        latest = use the latest version of SqlPackage.exe
        15 = SQL Server 2019
        14 = SQL Server 2017
        13 = SQL Server 2016
        12 = SQL Server 2014
        11 = SQL Server 2012
 
    If you are unsure which version(s) of SqlPackage.exe you have installed, use the function **Find-SqlPackageLocations** to obtain a full list.
 
    .EXAMPLE
    Select-SqlPackageVersion -PreferredVersion latest
 
    Attempt to find latest version of SqlPackage.exe
 
    .EXAMPLE
    Select-SqlPackageVersion -PreferredVersion 13
 
    Return the SQL Server 2016 version of SqlPackage.exe if it exists, otherwise return latest
 
    .OUTPUTS
    Returns the version of SqlPackage.exe found.
 
    .LINK
    https://github.com/DrJohnT/PublishDacPac
 
    .NOTES
    Written by (c) Dr. John Tunnicliffe, 2019-2021 https://github.com/DrJohnT/PublishDacPac
    This PowerShell script is released under the MIT license http://www.opensource.org/licenses/MIT
#>

    [OutputType([string])]
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [ValidateSet('150', '140', '130', '120', '110', '15', '14', '13', '12', '11', 'latest')]
        [string] $PreferredVersion
    )

    try {
        $specificVersion = $PreferredVersion -and $PreferredVersion -ne 'latest';
        $versions = '15', '14', '13', '12', '11' | Where-Object { $_ -ne $PreferredVersion }

        # Look for a specific version of Microsoft SQL Server SqlPackage.exe
        if ($specificVersion) {
            if ((Get-SqlPackagePath -Version $PreferredVersion)) {
                return $PreferredVersion
            }

            Write-Information "Version '$PreferredVersion' not found. Looking for alternative version."
        }

        # Look for latest or a previous version.
        foreach ($version in $versions) {
            if ((Get-SqlPackagePath -Version $version)) {
                # Warn falling back.
                if ($specificVersion) {
                    Write-Information "SQLPackage.exe version '$PreferredVersion' not found. Using version '$version'."
                }

                return $version;
            }
        }

        # Warn that SQLPackage not found.
        if ($specificVersion) {
            Write-Information "SQLPackage.exe version '$PreferredVersion' not found.";
        }
        else {
            Write-Warning ("SQLPackage was not found on the build agent server. Try installing Microsoft SQL Server Data-Tier Application Framework");
            Write-Warning ("For install instructions, see https://www.microsoft.com/en-us/download/details.aspx?id=57784/");
        }
    }
    catch {
        Write-Error "Select-SqlPackageVersion failed with error: $_";
    }
}