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

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

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

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

wget http://www.google.com/

12 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Если ваша Windows достаточно новая (например, версия 1809 или новее), есть "настоящий" локоть. curl имеет параметр командной строки "-O" (заглавная буква O; строчная буква не будет делать то же самое!) Опция "-O", альтернатива "--remote-name" сообщает curl, что сохраненный файл получает same name as the file-name part of the URL.

One needs to start this as "curl.exe", to discern it from the Alias "curl" for "Invoke-WebRequest". Incidentally it works in cmd.exe without changes.

Using the same example as in another answer here

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

(The site won't allow me to add this as a comment, since I apparently need more "reputation" for that - so it gets a new answer)

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 как действительный командлет / программа.

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

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

Следующая функция получит 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) {...} section обрабатывает простой случай, когда вы просто хотите загрузить файл в текущий каталог, используя имя, указанное в URL.

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

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

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

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

PowerShell Invoke-RestMethod может иметь меньше зависимостей, чем другие методы... если у вас установлен минимальный (или более старый) Windows Server.

См. сообщение об ошибке при запуске Invoke-WebRequest от имени системной учетной записи :

Invoke-WebRequest: невозможно проанализировать содержимое ответа, поскольку ядро ​​Internet Explorer недоступно или конфигурация первого запуска Internet Explorer не завершена. Укажите параметр UseBasicParsing и повторите попытку.


Это может быть альтернативой применению-UseBasicParsingопция, которая в некоторых случаях требуется приwgetилиInvoke-WebRequest.

Однако отображаемый ответ может быть в другом формате в зависимости от анализа данных:

PowerShell форматирует ответ в зависимости от типа данных. Для канала RSS или ATOM PowerShell возвращает XML-узлы Item или Entry. Для нотации объектов JavaScript (JSON) или XML PowerShell преобразует или десериализует содержимое в объекты [PSCustomObject].

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

например. Invoke-WebRequest -Uri " http://www.google.com/" -outfile "2.pdf"

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

Это должно работать для вас, чтобы обойти браузер без инициализации вещи. Обратите внимание на параметр -UseBasicParsing.

Invoke-WebRequest http://localhost -UseBasicParsing
Другие вопросы по тегам