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


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

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

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

wget http://www.google.com/

244
2017-11-28 09:56


происхождения


Смотрите также superuser.com/questions/25538/... - jiggunjer


ответы:


Вот простой 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 значительно улучшит скорость загрузки с большими файлами; эта переменная контролирует, будет ли отображаться пользовательский интерфейс выполнения.


199
2017-12-26 06:47



Теперь это правильный ответ, и я случайно наткнулся на wget, если у меня установлен фактический wget. Досадно, что он не может легко получить имя файла (вы должны указать его в перенаправлении вывода), но этот параметр имеет лучший интерфейс, чем реальный wget (на мой взгляд), так что это так. - Matthew Scharley
Но Windows 7 поставляется только с PowerShell 2.0, и результатом будет «Термин Invoke-WebRequest» не будет распознан как имя командлета ... ». - Peter Mortensen
Справедливое предупреждение: этот метод поместит весь контент файла в память, прежде чем записывать его в файл. Это не очень хорошее решение для загрузки больших файлов. - im_nullable
@im_nullable, хороший звонок - я добавил это к сообщению. - Warren Rumak
@dezza Я обновил ответ другим способом. Попробуйте снова. - Warren Rumak


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

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

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

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


169
2017-11-28 10:20



Пока это лучшее решение. Также, учитывая, что, похоже, я могу переписать его в одном формате линии, как (new-object System.Net.WebClient).DownloadFile( '$url, $path) это лучшее соответствие для wget Я видел до сих пор. Благодаря! - jsalonen
В качестве побочной заметки вы также можете сделать это асинхронно, используя что-то вроде (new-object System.Net.WebClient) .DownloadFileAsync (url, filePath) - James
Можем ли мы получить конкретный текст через Webclient и outout в блокнот? благодаря - Mowgli
Да, это работает из окна на Windows 7 (который поставляется с PowerShell 2.0). Образец: $client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html") - Peter Mortensen
Для получения URL-адреса и игнорирования результатов (например, части сценария прогрева IIS) используйте DownloadData: (new-object System.Net.WebClient).DownloadData($url) | Out-Null - BurnsBA


Там есть Invoke-WebRequest в предстоящей версии PowerShell 3:

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

81
2017-08-10 23:38



все элегантность dd... - gWaldo
@gВы вы шутите - это радость в использовании (говоря, как кто-то, просто изучая PS) - Jack Douglas
Я просто имею в виду, что -Outfile параметр кажется посторонним, когда вы можете просто использовать > (для перезаписи) или >> (добавить) в файл. - gWaldo
@gWaldo или даже вывести имя файла из URL-адреса, как wget делает :) - Peltier
И с PS 4.0, wget а также curl алюстированы Invoke-WebRequest(iwr) по умолчанию: D - Bob


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

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

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

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


16
2017-11-28 10:18



BITS полагается на поддержку на сервере, если она доступна в фоновом режиме, и вы можете получать обновления с другими командлетами. - Richard
Я попытался забрать google.com, но все, что я получаю, это Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)), Я озадачен: | - jsalonen
@jsalonen Я думаю, что BITS будет загружать файлы, а не страницы. Поскольку Ричард говорит, что он полагается на некоторую поддержку на стороне сервера (хотя я не думаю, что это специфичная для Microsoft). - Matthew Steeples
Я вижу, и я думаю, что я получаю смысл использовать BITS, однако, это не то, что я ищу здесь. - jsalonen
Мне нужно это запомнить. Благодаря! - flickerfly


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 не может работать здесь),


6
2018-05-25 10:22





Вот функция 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  

4
2017-08-12 10:48





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

2
2017-12-15 15:26





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

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

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

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


1
2017-09-27 03:21



Подумайте о добавлении цитированной ссылки на этот ответ, поддерживая то, что вы заявляете в случае, когда ссылка когда-либо умирает, поэтому контент ответа по-прежнему доступен, который в настоящее время доступен только по этой ссылке по вашему предложению. - Pimp Juice IT