2015-02-23 19 views
19

Tôi sử dụng phương pháp Invoke-WebRequest của Powershell để tải xuống tệp từ Amazon S3 sang phiên bản Windows EC2 của tôi.Powershell - Tại sao sử dụng Invoke-WebRequest chậm hơn nhiều so với trình duyệt Tải xuống?

Nếu tôi tải xuống tệp bằng Chrome, tôi có thể tải xuống tệp 200 MB trong 5 giây. Tải xuống tương tự trong PowerShell bằng cách sử dụng Invoke-WebRequest mất tối đa 5 phút.

Tại sao sử dụng Invoke-WebRequest chậm hơn và có cách nào tải xuống ở tốc độ tối đa trong tập lệnh PowerShell không?

+0

IE có được định cấu hình để sử dụng proxy mà Chrome không có trên hệ thống của bạn không? – alroc

+0

@alroc Tệp được tải xuống ở cùng tốc độ trong IE như trong Chrome. Nó chỉ làm chậm bằng cách sử dụng 'Invoke-WebRequest' –

+0

Vui lòng hiển thị mã của bạn. Bạn đang thấy loại sử dụng bộ nhớ nào trong khi quá trình tải xuống diễn ra trong PowerShell? – alroc

Trả lời

16

Tôi đã sử dụng

Invoke-WebRequest $video_url -OutFile $local_video_url 

Tôi đã thay đổi ở trên để

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

này phục hồi tốc độ tải xuống với những gì tôi đã nhìn thấy trong các trình duyệt của mình.

0

Tôi giả định lý do đằng sau lý do Invoke-WebRequest chậm hơn là phân tích kiểu phân tích của trang bạn đang yêu cầu, trong khi máy khách web .NET chỉ phát hành yêu cầu nhận và lưu phản hồi.

Phân tích cú pháp Invoke-WebRequest Nội dung, ParsedHtml, Biểu mẫu, InputFields, Liên kết, Hình ảnh, Tập lệnh, AllElements, BaseResponse và thuộc tính StatusCode.

Khá tốt article khi cào bằng Invoke-WebRequest.

1

Tôi vừa mới nhấn vấn đề này ngay hôm nay, nếu bạn thay đổi đối số ContentType thành application/octet-stream thì nhanh hơn nhiều (nhanh bằng cách sử dụng webclient). Lý do là vì lệnh Invoke-Request sẽ không cố gắng phân tích cú pháp câu trả lời dưới dạng JSON hoặc XML.

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

'-ContentType' chỉ dành cho' POST' yêu cầu AFAIK vì vậy nó có thể sẽ không tạo sự khác biệt. – rednoah

14

Nếu không chuyển đổi khỏi Invoke-WebRequest, hãy tắt thanh tiến trình đã làm cho tôi. Tôi tìm thấy câu trả lời từ chủ đề này: https://github.com/PowerShell/PowerShell/issues/2138 (jasongin nhận xét on Oct 3, 2016)

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

Đối với hồ 5MB của tôi trên localhost, thời gian tải đi từ độ tuổi 30 đến 250ms.

Lưu ý rằng để lấy thanh tiến trình trở lại trong vỏ đang hoạt động, bạn cần gọi $ProgressPreference = 'Continue'.

+1

Điều này tạo ra sự khác biệt rất lớn đối với chúng tôi (hàng chục giây xuống dưới một giây cho các tệp 10-30MB) - Tôi luôn nghi ngờ rằng đó là màn hình hiển thị tiến trình làm chậm mọi thứ nhưng không biết cách ngừng hoạt động nó. –

Các vấn đề liên quan