2011-11-28 09:56:40 +0000 2011-11-28 09:56:40 +0000
293
293

Natywna alternatywa dla wget w Windows PowerShell?

Wiem, że mogę pobrać i zainstalować wspomnianą bibliotekę (wget dla Windows), ale moje pytanie jest następujące:

W Windows PowerShell, czy istnieje natywna alternatywa dla wget?

Potrzebuję wget po prostu pobrać plik z danego adresu URL z HTTP GET. Na przykład:

wget http://www.google.com/

Odpowiedzi (11)

243
243
243
2013-12-26 06:47:06 +0000

Oto prosty PS 3.0 i późniejszy one-liner, który działa i nie wymaga dużo PS barf:

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

Zauważ, że:

  • wget jest aliasem dla Invoke-WebRequest
  • Invoke-WebRequest zwraca HtmlWebResponseObject , który zawiera wiele użytecznych właściwości parsowania HTML, takich jak Linki, Obrazy, Formy, Pola wejściowe, itp, ale w tym przypadku używamy tylko surowego Content
  • Zawartość pliku jest przechowywana w pamięci przed zapisem na dysk, przez co to podejście nie nadaje się do pobierania dużych plików
  • W przypadku instalacji Windows Server Core, będziesz musiał napisać to jako

  • Przed 20 września 2014, sugerowałem

Jeśli używasz Windows 7, będziesz musiał zainstalować wersję 4 lub nowszą Windows Management Framework.

Może się okazać, że zrobienie $ProgressPreference = "silentlyContinue" przed Invoke-WebRequest znacznie poprawi szybkość pobierania dużych plików; ta zmienna kontroluje czy wyświetlany jest postęp UI.

186
186
186
2011-11-28 10:20:08 +0000

Jeśli potrzebujesz tylko pobrać plik, możesz użyć metody DownloadFile obiektu WebClient :

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

Gdzie $url jest łańcuchem reprezentującym adres URL pliku, a $path reprezentuje lokalną ścieżkę do której plik zostanie zapisany.

Zauważ, że $path musi zawierać nazwę pliku; nie może to być tylko katalog.

88
88
88
2012-08-10 23:38:18 +0000

Jest Invoke-WebRequest w nadchodzącej wersji PowerShell 3:

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
18
18
18
2011-11-28 10:18:36 +0000

Jest trochę bałaganu, ale jest ten post na blogu który daje instrukcje do pobierania plików.

Alternatywnie (i to jest jeden polecam) można użyć BITS:

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

Pokaże on postęp i pobierze plik do bieżącego katalogu.

6
6
6
2014-05-25 10:22:13 +0000

PowerShell V4 One-liner:

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

lub

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

To jest w zasadzie Warren’s (awesome) V3 one-liner _(dzięki za to!) ] One-liner Warrena - który po prostu używa wget zamiast iwr - powinien nadal działać dla V3 (przynajmniej tak mi się wydaje; nie testowałem go jednak). W każdym razie. Ale kiedy próbujesz wykonać go w V4 PowerShell (tak jak ja próbowałem), zobaczysz, że PowerShell nie rozwiązuje wget jako poprawny cmdlet/program.

Dla zainteresowanych, to znaczy - jak odebrałem z komentarza Boba w odpowiedzi na zaakceptowaną odpowiedź (dzięki, człowieku!) - ponieważ jak PowerShell V4, wget i curl są domyślnie ustawione na Invoke-WebRequest. Tak więc, iwr nie może być rozwiązany (jak również wget nie może działać tutaj).

4
4
4
2014-08-12 10:48:51 +0000

Oto funkcja PowerShell, która rozwiązuje krótkie adresy URL przed pobraniem pliku

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(' 


Użyj go w ten sposób, aby pobrać plik do bieżącego folderu: 

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

Lub pobrać plik do określonego folderu:

Get-FileFromUri http://example.com/url/of/example/file C:\example-folder
```)) {
                $destination += $filename
            } else {
                $destination += ' 


Użyj go w ten sposób, aby pobrać plik do bieżącego folderu: 

&001 

Lub pobrać plik do określonego folderu: 

&001 + $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
        }  
    }  
}

Użyj go w ten sposób, aby pobrać plik do bieżącego folderu:

&001

Lub pobrać plik do określonego folderu:

&001

2
2
2
2014-12-15 15:26:13 +0000

Następująca funkcja otrzyma adres 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)
}

Niektóre komentarze:

  1. Ostatnie 4 linie są potrzebne tylko wtedy, gdy jesteś za pełnomocnikiem uwierzytelniającym. Dla prostego użytku, (New-Object Net.WebClient).DownloadFile($url, $path) działa dobrze.
  2. Ścieżka _musi być bezwzględna, ponieważ pobieranie nie odbywa się w Twoim aktualnym katalogu, więc ścieżki względne spowodują, że pobieranie zostanie gdzieś utracone.
  3. Sekcja if (!$path) {...} zajmuje się prostym przypadkiem, w którym chcesz po prostu pobrać plik do bieżącego katalogu, używając nazwy podanej w adresie URL.
1
1
1
2017-09-27 03:21:03 +0000

Użyj Windows 10 bash shell, który zawiera wget po skonfigurowaniu funkcji Windows.

Jak zainstalować Ubuntu bash shell na Windows: YouTube: Running Bash na Ubuntu na Windows! Podsystem Windows dla Linux Documentation

0
0
0
2018-11-27 18:05:22 +0000

Invoke-WebRequest z parametrem -outfile oczekuje łańcucha, więc jeśli Twoja nazwa pliku zaczyna się od liczby, a nie jest zamknięta w cudzysłowach, nie jest tworzony żaden plik wyjściowy.

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

Nie ma to wpływu na nazwy plików zaczynających się od litery.

0
0
0
2019-03-04 13:25:33 +0000

Jeśli Twój Windows jest wystarczająco nowy (jak wersja 1809 lub nowsza), istnieje “prawdziwe” curl dostępne. curl ma opcję linii poleceń “-O” (duża litera O; mała litera nie zrobi tego samego! ) Opcja “-O”, alternatywnie “–remote-name” mówi curl, że zapisany plik otrzymuje taką samą nazwę jak nazwa pliku w części adresu URL.

Trzeba to uruchomić jako “curl.exe”, aby odróżnić to od aliasu “curl” dla “Invoke-WebRequest”. Nawiasem mówiąc działa to w cmd.exe bez zmian.

Używając tego samego przykładu co w innej odpowiedzi tutaj

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

(Strona nie pozwoli mi dodać tego jako komentarza, ponieważ najwyraźniej potrzebuję do tego więcej “reputacji” - więc dostaje nową odpowiedź)

-1
-1
-1
2019-04-27 20:13:44 +0000

To powinno zadziałać, aby obejść bez przeglądarki zainicjowane rzeczy. Uwaga: “-UseBasicParsing” param.

Invoke-WebRequest http://localhost -UseBasicParsing