Câu hỏi Thay thế tự nhiên cho wget trong Windows PowerShell?


Tôi biết tôi có thể tải xuống và cài đặt thư viện nói trên (wget cho Windows), nhưng câu hỏi của tôi là:

Trong Windows PowerShell, có một thay thế riêng cho wget?

tôi cần wget chỉ cần truy xuất một tệp từ một URL đã cho bằng HTTP GET. Ví dụ:

wget http://www.google.com/

245
2017-11-28 09:56


gốc


Xem thêm superuser.com/questions/25538/… - jiggunjer


Các câu trả lời:


Dưới đây là một PS 3.0 đơn giản và sau đó một lớp lót hoạt động và không liên quan đến nhiều PS barf:

wget http://blog.stackexchange.com/ -OutFile out.html

Lưu ý rằng:

  • wget là bí danh cho Invoke-WebRequest
  • Invoke-WebRequest trả về một HtmlWebResponseObject, chứa rất nhiều thuộc tính phân tích cú pháp HTML hữu ích như Liên kết, Hình ảnh, Biểu mẫu, InputFields, v.v., nhưng trong trường hợp này, chúng tôi chỉ sử dụng Nội dung thô
  • Nội dung tệp được lưu trữ trong bộ nhớ trước khi ghi vào đĩa, làm cho phương pháp này không phù hợp để tải xuống các tệp lớn
  • Trên các cài đặt Windows Server Core, bạn sẽ cần phải viết như

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • Trước ngày 20 tháng 9 năm 2014, tôi đã đề xuất

    (wget http://blog.stackexchange.com/).Content >out.html
    

    như một câu trả lời. Tuy nhiên, điều này không hoạt động trong mọi trường hợp, như > toán tử (là bí danh cho Out-File) chuyển đổi đầu vào thành Unicode.

Nếu bạn đang sử dụng Windows 7, bạn sẽ cần phải cài đặt phiên bản 4 hoặc mới hơn của Windows Management Framework.

Bạn có thể thấy rằng làm một $ProgressPreference = "silentlyContinue" trước Invoke-WebRequest sẽ cải thiện đáng kể tốc độ tải xuống với các tệp lớn; biến này kiểm soát xem giao diện người dùng tiến trình có được hiển thị hay không.


200
2017-12-26 06:47



Điều này bây giờ là câu trả lời đúng, và tôi chạy vào wget vô tình kiểm tra nếu tôi đã cài đặt wget thực tế. Gây phiền nhiễu rằng nó không thể nhận được tên tập tin một cách dễ dàng (bạn phải xác định nó trong chuyển hướng đầu ra), nhưng tùy chọn này có một giao diện người dùng tốt hơn so với wget thực (theo ý kiến ​​của tôi) để có điều đó. - Matthew Scharley
Nhưng Windows 7 chỉ đi kèm với PowerShell 2.0và kết quả sẽ là "Thuật ngữ 'Gọi-WebRequest' không được nhận dạng là tên của lệnh ghép ngắn, ...". - Peter Mortensen
Cảnh báo công bằng: Phương pháp này sẽ đưa toàn bộ nội dung của tệp vào bộ nhớ trước khi ghi nó ra tệp. Đây không phải là giải pháp tốt để tải xuống các tệp lớn. - im_nullable
@im_nullable, cuộc gọi tốt - Tôi đã thêm điều đó vào bài đăng. - Warren Rumak
@dezza Tôi đã cập nhật câu trả lời với một cách tiếp cận khác. Thử lại lần nữa. - Warren Rumak


Nếu bạn chỉ cần truy xuất một tệp, bạn có thể sử dụng Tải tập tin phương pháp của WebClient vật:

$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)

Ở đâu $url là một chuỗi đại diện cho URL của tệp và $path đại diện cho đường dẫn cục bộ mà tệp sẽ được lưu vào.

Lưu ý rằng $path phải bao gồm tên tệp; nó không thể chỉ là một thư mục.


169
2017-11-28 10:20



Cho đến nay, đây là giải pháp tốt nhất được đề xuất. Cũng cho rằng có vẻ như tôi có thể viết lại nó theo một định dạng (new-object System.Net.WebClient).DownloadFile( '$url, $path) nó là thư từ tốt nhất cho wget Tôi đã thấy cho đến nay. Cảm ơn! - jsalonen
Như một mặt lưu ý, bạn cũng có thể làm điều này một cách không đồng bộ bằng cách sử dụng một cái gì đó như (đối tượng mới System.Net.WebClient) .DownloadFileAsync (url, filePath) - James
Chúng ta có thể lấy một văn bản cụ thể thông qua Webclient và outout đến một notepad? cảm ơn - Mowgli
Có, điều này hoạt động ra khỏi hộp trên Windows 7 (đi kèm với PowerShell 2.0). Mẫu vật: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
Để chỉ nhận url và bỏ qua kết quả (ví dụ: một phần của tập lệnh khởi động IIS), hãy sử dụng Tải xuống dữ liệu: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


Invoke-WebRequest trong PowerShell phiên bản 3 sắp tới:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html

81
2017-08-10 23:38



tất cả sự thanh lịch của dd... - gWaldo
@ gWaldo bạn đang đùa - đây là một niềm vui để sử dụng (nói như một người chỉ học PS) - Jack Douglas
Tôi chỉ có nghĩa là -Outfile tham số có vẻ không liên quan khi bạn chỉ có thể sử dụng > (để ghi đè) hoặc >> (để nối thêm) vào một tập tin. - gWaldo
@gWaldo hoặc thậm chí suy ra tên tệp từ URL giống như wget làm :) - Peltier
Và kể từ PS 4.0, wget và curl được phóng thích Invoke-WebRequest(iwr) theo mặc định: D - Bob


Đó là một chút lộn xộn nhưng có bài đăng trên blog này cung cấp cho bạn hướng dẫn tải xuống tệp.

Ngoài ra (và đây là một trong những tôi muốn khuyên bạn), bạn có thể sử dụng BITS:

Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"

Nó sẽ hiển thị tiến trình và sẽ tải tệp xuống thư mục hiện tại.


16
2017-11-28 10:18



BITS dựa vào sự hỗ trợ ở cuối máy chủ, nếu có sẵn điều này làm việc trong nền và bạn có thể nhận được các bản cập nhật tiến trình với các lệnh ghép ngắn khác. - Richard
Tôi đã cố gắng tìm nạp google.com, nhưng tất cả những gì tôi nhận được là Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Tôi bối rối: | - jsalonen
@jsalonen Tôi nghĩ rằng BITS sẽ chỉ tải xuống các tệp chứ không phải các trang. Như Richard nói nó dựa trên một số hỗ trợ phía máy chủ (mặc dù tôi không nghĩ rằng đó là Microsoft cụ thể). - Matthew Steeples
Tôi thấy và tôi nghĩ rằng tôi có được điểm bằng cách sử dụng BITS, tuy nhiên, nó không phải là những gì tôi đang tìm kiếm ở đây. - jsalonen
Tôi cần phải nhớ điều đó. Cảm ơn! - flickerfly


PowerShell V4 Một lớp lót:

(iwr http://blog.stackexchange.com/).Content >index.html`

hoặc là

(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4

Điều này về cơ bản Warren (tuyệt vời) V3 một lớp lót  (cám ơn vì cái này!) - chỉ với một thay đổi nhỏ để làm cho nó hoạt động trong PowerShell V4.

Warren của một lót - sử dụng đơn giản wget thay vì iwr - vẫn nên làm việc cho V3 (Ít nhất, tôi đoán, không thử nghiệm nó, mặc dù). Dù sao. Nhưng khi cố gắng thực hiện nó trong một V4 PowerShell (như tôi đã thử), bạn sẽ thấy PowerShell không giải quyết được wget như một lệnh / chương trình hợp lệ.

Đối với những người quan tâm, đó là - như tôi đã chọn Nhận xét của Bob trả lời câu trả lời được chấp nhận  (cảm ơn, người đàn ông!) - bởi vì với PowerShell V4, wget và curl được đặt bí danh thành Invoke-WebRequest, được đặt thành iwr theo mặc định. Như vậy, wgetkhông thể giải quyết (cũng như curl không thể làm việc ở đây).


6
2018-05-25 10:22





Đây là một chức năng PowerShell giải quyết các URL ngắn trước khi tải xuống tệp

function Get-FileFromUri {  
    param(  
        [parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [string]
        [Alias('Uri')]
        $Url,
        [parameter(Mandatory=$false, Position=1)]
        [string]
        [Alias('Folder')]
        $FolderPath
    )
    process {
        try {
            # resolve short URLs
            $req = [System.Net.HttpWebRequest]::Create($Url)
            $req.Method = "HEAD"
            $response = $req.GetResponse()
            $fUri = $response.ResponseUri
            $filename = [System.IO.Path]::GetFileName($fUri.LocalPath);
            $response.Close()
            # download file
            $destination = (Get-Item -Path ".\" -Verbose).FullName
            if ($FolderPath) { $destination = $FolderPath }
            if ($destination.EndsWith('\')) {
                $destination += $filename
            } else {
                $destination += '\' + $filename
            }
            $webclient = New-Object System.Net.webclient
            $webclient.downloadfile($fUri.AbsoluteUri, $destination)
            write-host -ForegroundColor DarkGreen "downloaded '$($fUri.AbsoluteUri)' to '$($destination)'"
        } catch {
            write-host -ForegroundColor DarkRed $_.Exception.Message
        }  
    }  
}  

Sử dụng nó như thế này để tải tệp xuống thư mục hiện tại:

Get-FileFromUri http://example.com/url/of/example/file  

Hoặc để tải tệp xuống thư mục được chỉ định:

Get-FileFromUri http://example.com/url/of/example/file  C:\example-folder  

4
2017-08-12 10:48





Hàm sau sẽ nhận URL.

function Get-URLContent ($url, $path) {
  if (!$path) {
      $path = Join-Path $pwd.Path ([URI]$url).Segments[-1]
  }
  $wc = New-Object Net.WebClient
  $wc.UseDefaultCredentials = $true
  $wc.Proxy.Credentials = $wc.Credentials
  $wc.DownloadFile($url, $path)
}

Một vài bình luận:

  1. 4 dòng cuối cùng chỉ cần thiết nếu bạn đứng sau một proxy xác thực. Để sử dụng đơn giản, (New-Object Net.WebClient).DownloadFile($url, $path) hoạt động tốt.
  2. Con đường phải tuyệt đối, vì việc tải xuống không được thực hiện trong thư mục hiện tại của bạn, do đó các đường dẫn tương đối sẽ dẫn đến việc tải xuống bị mất ở đâu đó.
  3. Các if (!$path) {...} phần xử lý trường hợp đơn giản, nơi bạn chỉ muốn tải tệp xuống thư mục hiện tại bằng tên được đặt trong URL.

2
2017-12-15 15:26





Sử dụng Windows bash shell bao gồm wget khi tính năng windows được thiết lập.

Cách cài đặt Ubuntu bash shell trên Windows:

YouTube: Chạy Bash trên Ubuntu trên Windows!

Hệ thống con Windows cho tài liệu Linux


1
2017-09-27 03:21



Xem xét việc thêm một số tham chiếu được trích dẫn vào câu trả lời này hỗ trợ những gì bạn nêu trong trường hợp liên kết chết vì vậy nội dung câu trả lời vẫn có sẵn hiện chỉ khả dụng qua liên kết đó theo đề xuất của bạn. - Pimp Juice IT