Родная альтернатива wget в Windows PowerShell?

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

В Windows PowerShell существует ли родная альтернатива wget ?

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

  wget http://www.google.com/
 
243 голоса | спросил jsalonen 28 12011vEurope/Moscow11bEurope/MoscowMon, 28 Nov 2011 13:56:40 +0400 2011, 13:56:40

8 ответов


199

Вот простой 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 ) преобразует введите в Юникод.

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

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

ответил Warren Rumak 26 ThuEurope/Moscow2013-12-26T10:47:06+04:00Europe/Moscow12bEurope/MoscowThu, 26 Dec 2013 10:47:06 +0400 2013, 10:47:06
169

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

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

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

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

ответил Traveling Tech Guy 28 12011vEurope/Moscow11bEurope/MoscowMon, 28 Nov 2011 14:20:08 +0400 2011, 14:20:08
81

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

  Invoke-WebRequest http://www.google.com/-OutFile c: \ google.html
 
ответил user4514 11 AM00000030000001831 2012, 03:38:18
16

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

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

  Импорт-модуль BitsTransfer
Start-BitsTransfer -source "http: //urlToDownload"
 

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

ответил Matthew Steeples 28 12011vEurope/Moscow11bEurope/MoscowMon, 28 Nov 2011 14:18:36 +0400 2011, 14:18:36
6

PowerShell V4 Однострочный:

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

или

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

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

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

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

ответил eyecatchUp 25 Maypm14 2014, 14:22:13
4

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

  функция Get-FileFromUri {
    пары (
        [параметр (Обязательный = $ true, Position = 0, ValueFromPipeline = $ true, ValueFromPipelineByPropertyName = $ true)]
        [Строка]
        [Псевдоним ( 'Ури')]
        $ Url,
        [параметр (Обязательный = $ false, Position = 1)]
        [Строка]
        [Псевдоним ( 'Папка')]
        $ путь_к_папке
    )
    обработать {
        пытаться {
            # разрешить короткие URL-адреса
            $ req = [System.Net.HttpWebRequest] :: Создать ($ Url)
            $ req.Method = "HEAD"
            $ response = $ req.GetResponse ()
            $ fUri = $ response.ResponseUri
            $ filename = [System.IO.Path] :: GetFileName ($ fUri.LocalPath);
            $ Response.Close ()
            # Скачать файл
            $ destination = (Get-Item -Path ". \" -Verbose) .FullName
            if ($ FolderPath) {$ destination = $ FolderPath}
            if ($ destination.EndsWith ('\')) {
                $ destination + = $ filename
            } else {
                $ destination + = '\' + $ имя_файла
            }
            $ webclient = Новый объект System.Net.webclient
            $ webclient.downloadfile ($ fUri.AbsoluteUri, $ destination)
            write-host -ForegroundColor DarkGreen «скачал» $ ($ fUri.AbsoluteUri) 'to' $ ($ destination) '"
        } поймать {
            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
 
ответил user25986 12 PM00000020000005131 2014, 14:48:51
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-адресе.
ответил Paul Moore 15 MonEurope/Moscow2014-12-15T18:26:13+03:00Europe/Moscow12bEurope/MoscowMon, 15 Dec 2014 18:26:13 +0300 2014, 18:26:13
1

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

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

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

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

ответил Miloud Eloumri 27 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 27 Sep 2017 06:21:03 +0300 2017, 06:21:03

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132