Alternatif asli untuk wget di Windows PowerShell?

Jawaban:

237

Berikut ini adalah PS 3.0 sederhana dan kemudian satu-liner yang berfungsi dan tidak melibatkan banyak PS PS:

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

Perhatikan bahwa:

  • wget adalah alias untuk Invoke-WebRequest
  • Invoke-WebRequest mengembalikan HtmlWebResponseObject , yang berisi banyak properti penguraian HTML yang berguna seperti Tautan, Gambar, Formulir, InputFields, dll., Tetapi dalam hal ini kami hanya menggunakan Konten mentah
  • Isi file disimpan dalam memori sebelum menulis ke disk, membuat pendekatan ini tidak cocok untuk mengunduh file besar
  • Pada instalasi Windows Server Core, Anda harus menuliskan ini sebagai

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • Sebelum 20 Sep 2014, saya menyarankan

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

    sebagai jawaban. Namun, ini tidak berfungsi dalam semua kasus, karena >operator (yang merupakan alias untuk Out-File) mengubah input ke Unicode.

Jika Anda menggunakan Windows 7, Anda harus menginstal versi 4 atau lebih baru dari Windows Management Framework.

Anda mungkin menemukan bahwa melakukan $ProgressPreference = "silentlyContinue"sebelum Invoke-WebRequestakan secara signifikan meningkatkan kecepatan unduhan dengan file besar; variabel ini mengontrol apakah UI kemajuan diberikan.

Warren Rumak
sumber
3
Ini sekarang jawaban yang benar, dan saya kebetulan tidak sengaja menguji apakah saya sudah menginstal wget yang sebenarnya. Mengganggu bahwa itu tidak bisa mendapatkan nama file dengan mudah (Anda harus menentukannya di redirection output), tetapi opsi ini memiliki UI yang lebih baik daripada wget nyata (menurut saya) jadi begitulah.
Matthew Scharley
13
Tetapi Windows 7 hanya hadir dengan PowerShell 2.0 , dan hasilnya adalah "Istilah 'Invoke-WebRequest' tidak dikenal sebagai nama cmdlet, ...".
Peter Mortensen
16
Peringatan yang adil: Metode ini akan menempatkan seluruh konten file ke dalam memori sebelum menuliskannya ke file. Ini bukan solusi yang baik untuk mengunduh file besar.
im_nullable
2
@ im_nullable, panggilan bagus - Saya telah menambahkannya ke posting.
Warren Rumak
1
@dezza Saya sudah memperbarui jawabannya dengan pendekatan yang berbeda. Coba lagi.
Warren Rumak
181

Jika Anda hanya perlu mengambil file, Anda bisa menggunakan metode DownloadFile dari objek WebClient :

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

Di mana $urlstring yang mewakili URL file, dan $pathmewakili jalur lokal tempat file akan disimpan.

Catatan yang $pathharus menyertakan nama file; tidak bisa hanya berupa direktori.

Bepergian Tech Guy
sumber
32
Sejauh ini ini merupakan solusi terbaik yang diusulkan. Juga mengingat bahwa sepertinya saya dapat menulis ulang dalam format satu baris karena (new-object System.Net.WebClient).DownloadFile( '$url, $path)ini adalah korespondensi terbaik yang pernah wgetsaya lihat sejauh ini. Terima kasih!
jsalonen
3
Sebagai catatan tambahan, Anda juga dapat melakukan ini secara tidak sinkron menggunakan sesuatu seperti (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath)
James
Bisakah kita mengambil teks tertentu melalui Webclient dan keluar ke notepad? terima kasih
Mowgli
6
Ya, ini bekerja di luar kotak pada Windows 7 ( yang datang dengan PowerShell 2.0 ). Contoh: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
Peter Mortensen
3
Untuk hanya mendapatkan url dan mengabaikan hasilnya (misalnya, bagian dari skrip pemanasan IIS) gunakan DownloadData:(new-object System.Net.WebClient).DownloadData($url) | Out-Null
BurnsBA
86

Ada Invoke-WebRequestdi PowerShell versi 3 yang akan datang:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
pengguna4514
sumber
9
semua keanggunan dd...
gWaldo
1
@ gWaldo Anda bercanda – ini adalah kesenangan untuk digunakan (berbicara sebagai seseorang yang baru belajar PS)
Jack Douglas
8
Saya hanya bermaksud bahwa -Outfileparameternya tampak asing ketika Anda bisa menggunakan >(untuk menimpa) atau >>(untuk menambahkan) ke file.
gWaldo
5
@ gWaldo atau bahkan menyimpulkan nama file dari URL seperti wget:)
Peltier
5
Dan pada PS 4.0, wgetdan curlaliasted to Invoke-WebRequest( iwr) secara default: D
Bob
18

Agak berantakan tapi ada posting blog ini yang memberi Anda petunjuk untuk mengunduh file.

Atau (dan ini adalah salah satu yang saya sarankan) Anda dapat menggunakan BITS:

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

Ini akan menunjukkan kemajuan dan akan mengunduh file ke direktori saat ini.

Matthew Steeples
sumber
3
BITS bergantung pada dukungan di ujung server, jika tersedia ini berfungsi di latar belakang dan Anda bisa mendapatkan pembaruan kemajuan dengan cmdlet lain.
Richard
2
Saya mencoba mengambil google.com , tetapi yang saya dapatkan hanyalah Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Saya bingung: |
jsalonen
1
@ jsalonen Saya pikir BITS hanya akan mengunduh file daripada halaman. Seperti kata Richard, itu bergantung pada beberapa dukungan sisi server (walaupun saya pikir itu bukan Microsoft spesifik).
Matthew Steeples
Saya melihat dan saya pikir saya mendapatkan poin dalam menggunakan BITS, namun, bukan itu yang saya cari di sini.
jsalonen
6

PowerShell V4 One-liner:

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

atau

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

Ini pada dasarnya Warren (luar biasa) V3 one-liner (terima kasih untuk ini!) - hanya dengan perubahan kecil untuk membuatnya bekerja di V4 PowerShell.

One-liner Warren - yang hanya menggunakan wgetdaripada iwr- masih harus bekerja untuk V3 (setidaknya, saya kira; tidak diuji, meskipun). Bagaimanapun. Tetapi ketika mencoba menjalankannya di V4 PowerShell (seperti yang saya coba), Anda akan melihat PowerShell gagal untuk menyelesaikan wgetsebagai cmdlet / program yang valid.

Bagi mereka yang tertarik, yaitu - ketika saya mengambil dari komentar Bob sebagai jawaban atas jawaban yang diterima (terima kasih, bung!) - karena pada PowerShell V4, wgetdan curlalias Invoke-WebRequest, diatur iwrsecara default . Dengan demikian, wgettidak bisa diselesaikan (juga curltidak bisa bekerja di sini) .

eyecatchUp
sumber
4

Berikut adalah fungsi PowerShell yang menyelesaikan URL pendek sebelum mengunduh file

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
        }  
    }  
}  

Gunakan seperti ini untuk mengunduh file ke folder saat ini:

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

Atau untuk mengunduh file ke folder yang ditentukan:

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

Fungsi berikut akan mendapatkan 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)
}

Beberapa komentar:

  1. 4 baris terakhir hanya diperlukan jika Anda berada di belakang proxy yang mengotentikasi. Untuk penggunaan sederhana, (New-Object Net.WebClient).DownloadFile($url, $path)berfungsi dengan baik.
  2. Path harus absolut, karena unduhan tidak dilakukan di direktori Anda saat ini, sehingga jalur relatif akan mengakibatkan unduhan tersesat di suatu tempat.
  3. The if (!$path) {...}Bagian menangani kasus sederhana di mana Anda hanya ingin men-download file ke direktori saat ini menggunakan nama yang diberikan dalam URL.
Paul Moore
sumber
1

Gunakan bash shell Windows 10 yang termasuk wget setelah fitur windows diatur.

Cara menginstal bash shell Ubuntu di Windows:

YouTube: Menjalankan Bash di Ubuntu di Windows!

Subsistem Windows untuk Dokumentasi Linux

Miloud Eloumri
sumber
1
Pertimbangkan untuk menambahkan beberapa referensi yang dikutip untuk jawaban ini yang mendukung apa yang Anda sebutkan seandainya tautan tersebut pernah mati sehingga konten jawaban masih tersedia yang saat ini hanya tersedia melalui tautan itu sesuai saran Anda.
Pimp Juice,
0

Jika Windows Anda cukup baru (seperti versi 1809 atau lebih baru), ada ikal "nyata" yang tersedia. curl memiliki opsi Baris perintah "-O" (huruf besar O; huruf kecil tidak akan melakukan hal yang sama!) Opsi "-O", atau "-remote-name" memberitahu curl, bahwa file yang disimpan mendapatkan nama yang sama dengan nama file-bagian dari URL.

Kita perlu memulai ini sebagai "curl.exe", untuk membedakannya dari "curl" Alias ​​untuk "Invoke-WebRequest". Kebetulan ia bekerja di cmd.exe tanpa perubahan.

Menggunakan contoh yang sama seperti pada jawaban lain di sini

curl.exe -O http://demo.mediacore.tv/files/31266.mp4

(Situs tidak akan mengizinkan saya untuk menambahkan ini sebagai komentar, karena saya tampaknya membutuhkan lebih banyak "reputasi" untuk itu - sehingga mendapat jawaban baru)

Dweia
sumber
0

Invoke-WebRequest dengan parameter -outfile mengharapkan string, jadi jika nama file Anda dimulai dengan angka, dan tidak dilampirkan dalam tanda kutip, tidak ada file output yang dibuat.

misalnya. Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

Ini tidak mempengaruhi nama file yang dimulai dengan huruf.

Zimba
sumber
Solusi ini disebutkan dalam jawaban lain ( wgetalias alias Invoke-WebRequest, dan mirip dengan yang di atas)
bertieb
Inti dari jawabannya adalah untuk menekankan catatan. Tidak satu pun dari jawaban yang berurusan dengan tidak ada file yang dibuat karena kesalahan sintaksis.
Zimba
Itu seharusnya benar-benar menjadi komentar pada jawaban lain [
bert
Jawaban ini tidak disediakan dalam jawaban lain atau mirip dengan yang di atas.
Zimba
-1

Ini seharusnya berfungsi agar Anda dapat mengatasi hal-hal yang tidak diinisialisasi oleh browser. Perhatikan param "-UseBasicParsing".

Invoke-WebRequest http://localhost -UseBasicParsing
Joe Healy
sumber
(1) Apa itu "hal-hal yang tidak diinisialisasi oleh browser"? (2) Perhatikan bahwa jawaban yang diterima sudah menyebutkan -UseBasicParsing.
Scott