Windows PowerShell'de wget'e yerel alternatif mi?


283

Yukarıda belirtilen kütüphaneyi indirebilir ve yükleyebilirim (Windows için wget), ancak sorum şu:

Windows PowerShell'de yerel bir alternatif var mı wget?

wgetBelirli bir URL’den HTTP GET’le bir dosya almak için basitçe ihtiyacım var . Örneğin:

wget http://www.google.com/

Yanıtlar:


236

İşte basit bir PS 3.0 ve daha sonra çalışan ve çok fazla PS barf içermeyen bir astar:

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

Bunu not et:

  • wget bir takma ad Invoke-WebRequest
  • Invoke-WebRequest , Bağlantılar, Görüntüler, Formlar, Girdi Alanları gibi birçok kullanışlı HTML ayrıştırma özelliği içeren bir HtmlWebResponseObject döndürür , ancak bu durumda sadece ham İçeriği kullanıyoruz.
  • Dosya içeriği diske yazmadan önce bellekte depolanır, bu yaklaşım büyük dosyaları indirmek için uygun değildir.
  • Windows Server Core kurulumlarında, bunu şöyle yazmanız gerekir.

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • 20 Eylül 2014'ten önce önerdim

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

    Bir cevap olarak. Ancak, >işleç (bunun diğer adı olan Out-File) girişi Unicode'a dönüştürdüğü için bu her durumda işe yaramaz .

Windows 7 kullanıyorsanız, sürüm 4’ü veya Windows Yönetim Çerçevesi’nin daha yeni bir sürümünü yüklemeniz gerekir.

Daha $ProgressPreference = "silentlyContinue"önce yapmanın Invoke-WebRequest, büyük dosyalarla indirme hızını önemli ölçüde artıracağını görebilirsiniz; bu değişken, ilerleme arayüzünün oluşturulup oluşturulmadığını kontrol eder.


3
Bu şimdi doğru cevap, ve gerçek wget kurulu olsaydı yanlışlıkla test wget karşılaştı. Dosya adını kolayca elde edememesi can sıkıcı (çıktı yeniden yönlendirmesinde belirtmeniz gerekir), ancak bu seçenek gerçek wget'den daha iyi bir kullanıcı arabirimine sahip (bence).
Matthew Scharley

13
Ancak Windows 7 yalnızca PowerShell 2.0 ile gelir ve sonuç "Invoke-WebRequest" terimi cmdlet'in adı olarak tanınmaz ... "olur.
Peter Mortensen,

16
Adil uyarı: Bu yöntem, dosyaya yazmadan önce dosyanın tüm içeriğini belleğe koyacaktır. Bu büyük dosyaları indirmek için iyi bir çözüm değildir.
im_nullable

2
@ im_nullable, iyi çağrı - Bunu gönderiye ekledim.
Warren Rumak

1
@dezza Yanıtı farklı bir yaklaşımla güncelledim. Tekrar dene.
Warren Rumak

181

Sadece bir dosya almanız gerekiyorsa , WebClient nesnesinin DownloadFile yöntemini kullanabilirsiniz :

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

Nerede $urldosyanın URL'sini temsil eden bir dize ve $pathdosya kaydedilir yerel yolunu temsil ediyor.

$pathDosya adını içermesi gerektiğini unutmayın ; sadece bir dizin olamaz.


32
Şimdiye kadar bu önerilen en iyi çözüm olmuştur. Ayrıca ben bir satır biçiminde yazabiliriz görünüyor verilen (new-object System.Net.WebClient).DownloadFile( '$url, $path)bu en iyi yazışma olduğunu wgetşimdiye kadar gördük. Teşekkürler!
jsalonen

3
Bir de (yeni-nesne System.Net.WebClient) .DownloadFileAsync (url, filePath) gibi bu uyumsuz kullanarak bir şeyler yapabiliriz yan not olarak
James

Webclient ve outout yoluyla belirli bir metni bir not defterine getirebilir miyiz? teşekkürler
Mowgli

6
Evet, bu Windows 7'deki ( PowerShell 2.0 ile birlikte gelen ) kutunun dışında çalışır . Örnek: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
Peter Mortensen,

3
Sadece bir URL almak ve sonuçları yok saymak için (örneğin, bir IIS ısınma komut dosyasının parçası) DownloadData:(new-object System.Net.WebClient).DownloadData($url) | Out-Null
BurnsBA

86

Orada Invoke-WebRequestyaklaşan PowerShell sürüm 3:

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

9
tüm zerafeti dd...
gWaldo

1
@ şaka yapıyorsun @gWaldo - bu bir neşedir (PS'yi öğrenen biri olarak konuşmak)
Jack Douglas

8
Ben sadece bir dosyayı ( üzerine yazmak için) veya (eklemek için) -Outfilekullanabiliyorken parametrenin gereksiz göründüğünü söylüyorum . >>>
gWaldo

5
@gWaldo veya dosya adını URL'den aynen olduğu gibi çıkar wget:)
Peltier

5
Ve PS 4.0 itibariyle wgetve curlhiç aliasted edilir Invoke-WebRequest( iwrvarsayılan olarak): D
Bob

18

Biraz dağınık ama dosyaları indirmek için talimatlar veren bu blog yazısı var.

Alternatif olarak (ve bu bir tavsiye ederim) BITS kullanabilirsiniz:

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

İlerleme gösterecek ve dosyayı geçerli dizine indirecektir.


3
BITS, arka planda çalışırsa ve diğer cmdlet'lerle ilerleme güncellemeleri alabilirsiniz, sunucu ucunda desteğe dayanır.
Richard

2
Google.com'u almaya çalıştım , ancak elimde olan tek şey Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)). Şaşırdım: |
jsalonen

1
@jsalonen BITS’nin sadece sayfa yerine dosyaları indireceğini düşünüyorum. Richard'ın dediği gibi bazı sunucu tarafı desteğine dayanıyor (Microsoft'a özgü olduğunu sanmıyorum).
Matthew Steeples

Görüyorum ve sanırım BITS'yi kullanmaya başladım, ancak burada aradığım şey değil.
jsalonen

6

PowerShell V4 Tek astar:

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

veya

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

Bu temelde Warren'ın (harika) V3 tek-astarıdır (bunun için teşekkürler!) - V4 PowerShell'de çalışması için sadece küçük bir değişiklikle.

Warren'ın basitçe wgetyerine kullanan tek astarıiwr hala V3 için çalışmalı (En azından sanırım; test etmedi). Neyse. Ancak bir V4 PowerShell'de çalıştırmaya çalışırken (denedim), PowerShell'in wgetgeçerli bir cmdlet / program olarak çözemediğini göreceksiniz .

Ben alıp olarak - ilgilenenler için, yani Bob'un yorumun cevaben kabul edilen yanıt (teşekkürler dostum!) - çünkü PowerShell V4 olarak, wgetve curldiğer adı olan Invoke-WebRequestayarlı, iwrvarsayılan olarak . Böylece, wgetçözümlenemez ( curlburada da çalışamaz) .


4

İşte dosyayı indirmeden önce kısa URL'leri çözen bir PowerShell işlevi

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

Dosyayı geçerli klasöre indirmek için bu şekilde kullanın:

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

Veya dosyayı belirtilen klasöre indirmek için:

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

2

Aşağıdaki işlev bir URL alır.

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

Bazı yorumlar:

  1. Son 4 satır, yalnızca kimlik doğrulaması yapan bir proxy’nin arkasındaysanız gereklidir. Basit kullanım için, iyi (New-Object Net.WebClient).DownloadFile($url, $path)çalışıyor.
  2. İndirme işlemi geçerli dizinde yapılmadığından, yolun mutlak olması gerekir , bu nedenle göreceli yollar indirmenin bir yerde kaybolmasına neden olur.
  3. if (!$path) {...}Bölümde yalnızca URL'yi verilen ad kullanarak mevcut dizine dosyayı indirmek isteyen basit durumda işler.

1

Windows özelliği kurulduktan sonra wget içeren Windows 10 bash kabuğunu kullanın.

Windows'ta Ubuntu bash kabuğu nasıl kurulur:

YouTube: Windows'ta Ubuntu'da Bash'i Çalıştırmak!

Linux Belgeleri için Windows Alt Sistemi


1
Bağlantının sona ermesi durumunda neyi ifade ettiğinizi belirtmek için bu cevaba bazı referanslar eklemeyi düşünün, böylece yanıt içeriği halen öneriniz başına bu bağlantı üzerinden kullanılabilir durumda olacaktır.
Pezevenk Suyu BT

0

Windows'unuz yeterince yeniyse (sürüm 1809 veya daha yenisi gibi), mevcut bir "gerçek" kıvrılma vardır. curl "-O" komut satırı seçeneğine sahiptir (büyük harf O; küçük harf aynı olmaz!) "-O" seçeneği, alternatif olarak "--remote-name", curl'a kaydedilen dosyanın alacağını belirtir URL’nin dosya adı kısmıyla aynı adda.

Bunu, "Invoke-WebRequest" için "curl" takma adından ayırt etmek için bunu "curl.exe" olarak başlatmanız gerekir. Bu arada, değişiklik olmadan cmd.exe içinde çalışır.

Burada başka bir cevapta olduğu gibi aynı örneği kullanarak

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

(Site, bunu bir yorum olarak eklememe izin vermiyor, çünkü bunun için daha fazla "itibara" ihtiyacım var - bu yüzden yeni bir cevap alıyor)


0

Invoke-WebRequest ile -outfile parametresi bir dize bekler, bu nedenle dosya adınız bir sayıyla başlar ve tırnak içine alınmazsa, çıktı dosyası oluşturulmaz.

Örneğin. Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

Bu, bir harfle başlayan dosya adlarını etkilemez.


Bu çözüm diğer cevaplarda da belirtilmiştir ( wgetbir takma ad Invoke-WebRequestve yukarıdakine benzer)
bertieb

Cevabın amacı notu vurgulamaktı. Yanıtların hiçbiri, sözdizimi hatası nedeniyle oluşturulan hiçbir dosyayla ilgilenmiyor.
Zimba

Bu gerçekten diğer cevap [s] bir yorum olmalı
bertieb

Bu cevap, diğer cevaplarda ya da yukarıdaki cevaplara benzer şekilde sunulmamıştır.
Zimba

-1

Tarayıcı tarafından başlatılan hiçbir öğeyi aşmamak için bu işlem çalışmalıdır. "-UseBasicParsing" paramına dikkat edin.

Invoke-WebRequest http://localhost -UseBasicParsing

(1) “Tarayıcı başlatılmış öğe yok” nedir? (2) Kabul edilen cevabın zaten bahsettiğini unutmayın -UseBasicParsing.
Scott
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.