CmdLets/Get-AppsDownload.ps1

Function Get-AppsDownload 
 {

    [CmdletBinding()]
     Param(
        [Parameter(Mandatory=$True)]
            $Applications,
        [Parameter(Mandatory=$True)]
            [System.IO.FileInfo]$DownloadPath,
        [Parameter(Mandatory=$False)]
            [Switch]$Force
    )
    
    ForEach ($Application in $Applications) {
        $i++; Write-Progress -ID 0 -Activity "Downloading Applications" -Status "Downloading: $($Application.Name)" -PercentComplete (($i/$Applications.Count)*100);
        Write-Host "Download: $($Application.Name)"
        $Destination = Join-Path $DownloadPath $Application.Name
        If (!(Test-Path $Destination)) { New-ItemWrapper -Path $Destination }
        ForEach ($ScriptBlock in $Application.PreScriptBlocks) { 
            Write-Host $ScriptBlock
            Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
        }

        $ProgressPreference = 'SilentlyContinue'
        ForEach ($URI in $Application.URIs) {
            ForEach ($ScriptBlock in $URI.PreScriptBlocks) { 
                Write-Host $ScriptBlock
                Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
            }
            if ($URI.FileName) {
                $OutFile = Join-Path $Destination $URI.FileName
            } else {
                $OutFile = Join-Path $Destination (Split-Path $URI.URI -Leaf)
            }

            If (!(Test-Path $OutFile) -or $Force.IsPresent ) {
                Write-Host "`tDownloading: $($URI.URI)"
                Invoke-WebRequest -UseBasicParsing -Uri $URI.URI -OutFile $OutFile
            }

            ForEach ($ScriptBlock in $URI.PostScriptBlocks) { 
                Write-Host $ScriptBlock
                Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
            }
        }
        ForEach ($ScriptBlock in $Application.PostScriptBlocks) { 
            Write-Host $ScriptBlock
            Invoke-Command -ScriptBlock ([ScriptBlock]::Create($ScriptBlock)) -NoNewScope
        }
    }
    Write-Progress -ID 0 -Activity "Downloading Applications" -Completed

}