263

Я знаю, что могу загрузить и установить вышеупомянутую библиотеку (wget для Windows), но мой вопрос таков:

Есть ли в Windows PowerShell нативная альтернатива wget?

Мне нужен wget чтобы просто получить файл с заданного URL с помощью HTTP GET. Например:

wget http://www.google.com/

9 ответов9

217

Вот простой PS 3.0 и более поздний однострочный, который работает и не требует большого количества PS barf:

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

Обратите внимание, что:

  • wget - это псевдоним Invoke-WebRequest
  • Invoke-WebRequest возвращает HtmlWebResponseObject, который содержит множество полезных свойств анализа HTML, таких как ссылки, изображения, формы, поля ввода и т.д., Но в этом случае мы просто используем необработанный контент
  • Содержимое файла хранится в памяти перед записью на диск, что делает этот подход непригодным для загрузки больших файлов.
  • При установке Windows Server Core вам нужно записать это как

    wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html
    
  • До 20 сентября 2014 года я предложил

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

    как ответ.  Однако это работает не во всех случаях, поскольку оператор >(который является псевдонимом Out-File) преобразует входные данные в Unicode.

Если вы используете Windows 7, вам необходимо установить версию 4 или более новую платформу Windows Management Framework.

Вы можете обнаружить, что выполнение $ProgressPreference = "silentlyContinue" перед Invoke-WebRequest значительно улучшит скорость загрузки с большими файлами; эта переменная контролирует, отображается ли пользовательский интерфейс прогресса.

176

Если вам просто нужно получить файл, вы можете использовать метод DownloadFile объекта WebClient :

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

Где $url - строка, представляющая URL-адрес файла, а $path - локальный путь, в который будет сохранен файл.

Обратите внимание, что $path должен включать имя файла; это не может быть просто каталог.

83

В следующей версии PowerShell 3 существует Invoke-WebRequest :

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

Это немного грязно, но есть этот пост в блоге, который дает вам инструкции для загрузки файлов.

В качестве альтернативы (и я рекомендую это) вы можете использовать биты:

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

Он покажет прогресс и загрузит файл в текущий каталог.

6

PowerShell V4 One-liner:

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

или же

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

Это в основном Уоррен (удивительный) однострочный V3 (спасибо за это!) - с небольшим изменением, чтобы он работал в PowerShell V4.

Однострочник Уоррена - который просто использует wget а не iwr - все равно должен работать для V3 (по крайней мере, я думаю, хотя и не проверял его). Тем не мение. Но при попытке выполнить его в PowerShell V4 (как я пытался) вы увидите, что PowerShell не удается разрешить wget как допустимый командлет / программу.

Для тех, кто заинтересован, это - как я понял из комментария Боба в ответ на принятый ответ (спасибо, мужик!) - потому что в PowerShell V4 wget и curl имеют псевдоним Invoke-WebRequest , по умолчанию установлен в iwr. Таким образом, wget не может быть разрешен (так же как curl не может работать здесь).

4

Вот функция PowerShell, которая разрешает короткие URL-адреса перед загрузкой файла

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

Используйте это так, чтобы загрузить файл в текущую папку:

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

Или загрузить файл в указанную папку:

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

Следующая функция получит 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)
}

Некоторые комментарии:

  1. Последние 4 строки нужны, только если вы находитесь за прокси-сервером аутентификации. Для простого использования, (New-Object Net.WebClient).DownloadFile($url, $path) работает нормально.
  2. Путь должен быть абсолютным, поскольку загрузка не выполняется в текущем каталоге, поэтому относительные пути приведут к потере загрузки.
  3. if (!$path) {...} обрабатывает простой случай, когда вы просто хотите загрузить файл в текущий каталог, используя имя, указанное в URL.
1

Используйте оболочку Windows 10 bash, которая включает в себя wget после настройки Windows.

Как установить оболочку Ubuntu Bash на Windows:

YouTube: запуск Bash в Ubuntu под Windows!

Документация по подсистеме Windows для Linux

-1

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

Примечание: параметр -outfile ожидает строку, поэтому, если имя вашего файла начинается с цифры и не заключено в кавычки, выходной файл не создается.

Это не влияет на имена файлов, начинающиеся с буквы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .