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

时间:2015-02-23 20:17:39

标签: powershell amazon-ec2 amazon-s3 powershell-v3.0

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

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

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

6 个答案:

答案 0 :(得分:47)

如果不切换Invoke-WebRequest,关闭进度条就可以了。我找到了这个帖子的答案:https://github.com/PowerShell/PowerShell/issues/2138(jasongin于2016年10月3日发表评论)

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

对于localhost上的5MB文件,下载时间从30秒到250毫秒。

请注意,要将进度条重新置于活动shell中,您需要调用$ProgressPreference = 'Continue'

答案 1 :(得分:23)

我正在使用

Invoke-WebRequest $video_url -OutFile $local_video_url

我将上面改为

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

$ProgressPreference = 'SilentlyContinue' 我将其从52分钟降低到14秒,得到了4.5亿个文件。 壮观的。

答案 4 :(得分:0)

我会假设为什么Invoke-WebRequest较慢的原因是它正在对您请求的页面进行刮刀样式解析,而.NET Web客户端只是发出一个get请求并保存响应。

Invoke-WebRequest解析Content,ParsedHtml,Forms,InputFields,Links,Images,Scripts,AllElements,BaseResponse和StatusCode属性。

使用Invoke-WebRequest进行抓取时非常好article

答案 5 :(得分:0)

单线下载文件到temp目录:

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