使用 PowerShell 下载大文件

使用 PowerShell 下载大文件

我尝试了以下

调用-Web请求-Uri”https://download.microsoft.com/download/6/4/8/648EB83C-00F9-49B2-806D-E46033DA4AE6/ExchangeServer2016-CU1.iso“-OutFile“Exchange.iso”

但由于“OutOfMemory”而失败。

然后我尝试了 -TransferEncoding“chunked”,它告诉我必须先设置“SendChunked”属性。

文档没有告诉如何、在何处以及何时设置此属性......

答案1

PowerShell 限制远程连接(旧版本限制为 128MB 左右)。您可以使用 增加该限制Set-Item .\MaxMemoryPerShellMB。但这可能无法解决非常大的文件的问题。

最好的选择是使用 BITS

例子:

$url = "http://files.net/test/file1.test"
$output = "$PSScriptRoot\file1.test"
$start_time = Get-Date

Import-Module BitsTransfer

Start-BitsTransfer -Source $url -Destination $output
***OR***
Start-BitsTransfer -Source $url -Destination $output -Asynchronous

Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

或者,尝试.Net.WebClient:

$url = "http://files.net/test/file1.test"
$output = "$PSScriptRoot\file1.test"
$start_time = Get-Date
    $wc = New-Object System.Net.WebClient
    $wc.DownloadFile($url, $output)
    ***OR***
    (New-Object System.Net.WebClient).DownloadFile($url, $output)

    Write-Output "Time taken: $((Get-Date).Subtract($start_time).Seconds) second(s)"

答案2

BitsTransfer 适用于大文件。下面是一个使用 Write-Progress 的示例。一旦启动作业并获得引用 ($download),您就可以与其交互以显示下载进度。我发现 Complete-BitsTransfer 是必要的后续步骤,因为如果没有它,文件的名称就会是“BIT52DB.tmp”,而不是“exampleFile.zip”。

$output = "C:\ProgramFiles\LocalPath\exampleFile.zip";
$download = Start-BitsTransfer -Source $url -Destination $output -Asynchronous
while ($download.JobState -ne "Transferred") { 
    [int] $dlProgress = ($download.BytesTransferred / $download.BytesTotal) * 100;
    Write-Progress -Activity "Downloading File..." -Status "$dlProgress% Complete:" -PercentComplete $dlProgress; 
}
Complete-BitsTransfer $download.JobId;

相关内容