Public/Save-LatestUpdate.ps1
Function Save-LatestUpdate { <# .SYNOPSIS Downloads the latest cumulative update passed from Get-LatestUpdate. .DESCRIPTION Downloads the latest cumulative update passed from Get-LatestUpdate to a local folder. The update can then be imported into an MDT share with Import-LatestUpdate. .NOTES .PARAMETER Updates The array of latest cumulative updates retreived by Get-LatestUpdate. .PARAMETER Path A destination path for downloading the cumulative updates to. This path must exist. #> [CmdletBinding(SupportsShouldProcess = $True)] [OutputType([Array])] Param( [Parameter(Mandatory = $True, Position = 0, ValueFromPipeline = $True, ValueFromPipelineByPropertyName = $True, ` HelpMessage = "The array of updates from Get-LatestUpdate.")] [ValidateNotNullOrEmpty()] [array]$Updates, [Parameter(Mandatory = $False, Position = 1, ValueFromPipeline = $False, ` HelpMessage = "Specify a target path to download the update(s) to.")] [ValidateScript( { If (Test-Path $_ -PathType 'Container') { $True } Else { Throw "Cannot find path $_" } })] [string]$Path = $PWD ) Begin { $Path = Test-UpdateParameter (Get-Item $Path).FullName $Urls = $Updates | Select-UniqueUrl } Process { ForEach ( $Url in $Urls ) { $Filename = Split-Path $Url -Leaf $Target = "$($Path)\$($Filename)" $DisplayName = $Updates | Where-Object { $_.Url -eq $Url } | Select-Object -ExpandProperty Note | Select-Object -First 1 Write-Verbose "`t`tDownload target will be $Target" If (!(Test-Path -Path $Target)) { If (Get-Command Start-BitsTransfer -ErrorAction SilentlyContinue) { If ($pscmdlet.ShouldProcess($(Split-Path $Url -Leaf), "BitsDownload")) { Start-BitsTransfer -Source $Url -Destination $Target ` -Priority High -ErrorAction Continue -ErrorVariable $ErrorBits ` -DisplayName $DisplayName -Description "Downloading $($Url)" } } Else { If ($pscmdlet.ShouldProcess($Url, "WebDownload")) { Invoke-WebRequest -Uri $Url -OutFile $Target } } } Else { Write-Verbose "File exists: $Target. Skipping download." } } } End { $Urls } } |