我使用Powershell的Invoke-WebRequest
方法将文件从Amazon S3下载到我的Windows EC2实例。
如果我使用Chrome下载文件,我可以在5秒内下载200 MB文件。使用Invoke-WebRequest
在PowerShell中进行的相同下载最多需要5分钟。
为什么使用Invoke-WebRequest
速度较慢,有没有办法在PowerShell脚本中全速下载?
答案 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")