Powershell - 为什么使用 Invoke-WebRequest 比浏览器下载慢得多?

Powershell - Why is Using Invoke-WebRequest Much Slower Than a Browser Download?

我使用 Powershell 的 Invoke-WebRequest 方法将文件从 Amazon S3 下载到我的 Windows EC2 实例。

如果我使用 Chrome 下载文件,我可以在 5 秒内下载一个 200 MB 的文件。使用 Invoke-WebRequest 在 PowerShell 中进行相同的下载最多需要 5 分钟。

为什么使用 Invoke-WebRequest 速度较慢,有没有办法在 PowerShell 脚本中全速下载?

我正在使用

Invoke-WebRequest $video_url -OutFile $local_video_url

我把上面的改成了

$wc = New-Object net.webclient
$wc.Downloadfile($video_url, $local_video_url)

这使下载速度恢复到我在浏览器中看到的速度。

我今天刚遇到这个问题,如果您将 ContentType 参数更改为 application/octet-stream 它会快得多(与使用 webclient 一样快)。原因是 Invoke-Request 命令不会尝试将响应解析为 JSON 或 XML.

Invoke-RestMethod -ContentType "application/octet-stream" -Uri $video_url  -OutFile $local_video_url

在不离开 Invoke-WebRequest 的情况下,关闭进度条为我完成了。我从这个线程中找到了答案:https://github.com/PowerShell/PowerShell/issues/2138(jasongin 于 2016 年 10 月 3 日发表评论)

$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest <params>

对于我在本地主机上的 5MB 文件,下载时间从 30 秒变为 250 毫秒。

注意要让进度条回到活动状态shell,需要调用$ProgressPreference = 'Continue'.

将文件下载到临时目录的一行代码:

(New-Object Net.WebClient).DownloadFile("https://www.google.com", "$env:temp\index.html")

$ProgressPreference = 'SilentlyContinue' 对于 450 M 的文件,我将它从 52 分钟减少到 14 秒。 壮观。