functions/Invoke-Download.ps1

function Invoke-WUDownload {
    <#
        .SYNOPSIS
        Download files at high speed using aria2.
 
        .DESCRIPTION
        Download files at high speed using aria2.
 
        .EXAMPLE
        PS C:\>Invoke-WUDownload -Uri "https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" -Destination $env:TMP -MaxConnectionPerServer 16 -Force
 
        This example downloads the file from the specified URI to $env:TMP. The maximum number of connections to one server is 16. Overwrites the destination file if it already exists.
    #>


    [CmdletBinding(SupportsShouldProcess,
        DefaultParameterSetName = 'Path')]
    param (
        # Specify the Uri of the file to download.
        [Parameter(Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [uri]
        $Uri,

        # Specifies the path to the location where the items are being downloaded. The default is the current directory.
        [ValidateNotNullOrEmpty()]
        [string]
        $Destination = $PWD,

        # Specify the maximum number of connections to one server. The range of numbers is 1 to 16.
        [ValidateRange(1, 16)]
        [int]
        $MaxConnectionPerServer = 16,

        # Specify when overwriting the file.
        [switch]
        $Force
    )

    begin {
        Set-StrictMode -Version 'Latest'
    }

    process {
        $DestinationFullPath = ''
        $DestinationFullPath = $psCmdlet.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Destination)
        if (!$DestinationFullPath) {
            return
        }

        if ((Test-Path -LiteralPath $DestinationFullPath -PathType Container)) {
            if (!(Assert-WUPathProperty -LiteralPath $DestinationFullPath -PSProvider FileSystem -PathType Container)) {
                return
            }
            $outDirPath = $DestinationFullPath
            $outName = ''
        }
        else {
            $outDirPath = Split-Path $DestinationFullPath -Parent
            $outName = Split-Path $DestinationFullPath -Leaf

            if (!$outDirPath) {
                Write-Error "Failed to get the parent directory of path '$DestinationFullPath'."
                return
            }

            if ((Test-Path -LiteralPath $outDirPath -PathType Container)) {
                if (!(Assert-WUPathProperty -LiteralPath $outDirPath -PSProvider FileSystem -PathType Container)) {
                    return
                }
            }
            else {
                New-Item -Path $outDirPath -ItemType 'Directory' -Force | Out-String | Write-Verbose
                if (!(Assert-WUPathProperty -LiteralPath $outDirPath -PSProvider FileSystem -PathType Container)) {
                    return
                }
            }
        }

        $cmd = '& aria2c --auto-file-renaming=false -x {0} ' -f $MaxConnectionPerServer
        $cmd = '{0} -d "{1}"' -f $cmd, (Convert-WUString -String $outDirPath -Type EscapeForPowerShellDoubleQuotation)
        if ($outName) {
            $cmd = '{0} -o "{1}"' -f $cmd, (Convert-WUString -String $outName -Type EscapeForPowerShellDoubleQuotation)
        }
        if ($Force) {
            $cmd = '{0} --allow-overwrite=true' -f $cmd
        }
        $cmd = '{0} "{1}"' -f $cmd, (Convert-WUString -String $Uri -Type EscapeForPowerShellDoubleQuotation)

        Write-Host "Downloading from '$Uri' to '$outDirPath'"
        if ($pscmdlet.ShouldProcess($cmd, 'Execute')) {
            Invoke-Expression $cmd
        }
    }
}