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

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

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

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

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

wget http://www.google.com/

Ответы (11)

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

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

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

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

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

  • До 20 сентября 2014 года я предложил

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

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

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

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

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

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

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

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

В грядущей версии PowerShell 3: Invoke-WebRequest ](http://technet.microsoft.com/en-us/library/hh849901.aspx) есть [ &007 ]&003:

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

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

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

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

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

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

PowerShell V4 One-liner:

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

или

  • *

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

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

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

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


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

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

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

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


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

&001 


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

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

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

&001

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

&001

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

Следующая функция получит 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. Путь must должен быть абсолютным, так как загрузка не производится в текущем каталоге, поэтому относительные пути приведут к тому, что загрузка где-то потеряется.
  3. Раздел if (!$path) {...} обрабатывает простой случай, когда вы просто хотите загрузить файл в текущий каталог, используя имя, указанное в URL.
1
1
1
2017-09-27 03:21:03 +0000

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

Как установить оболочку Ubuntu bash на Windows: YouTube: Запуск Bash на Ubuntu на Windows! Подсистема Windows для Linux Documentation

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

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

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

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

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

Если ваша Windows достаточно новая (как версия 1809 или более новая), то доступен “настоящий” curl. curl имеет опцию command-Line “-O” (заглавная буква O; маленькая буква не будет делать то же самое! ) Опция “-O”, или “–remote-name” говорит curl, что сохраненный файл получает то же имя, что и часть URL с именем файла.

Нужно запустить его как “curl.exe”, чтобы отличить его от псевдонима “curl” для “Invoke-WebRequest”. Кстати, он работает в cmd.exe без изменений.

Используя тот же пример, что и в другом ответе здесь

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

(Сайт не позволит мне добавить это в качестве комментария, так как для этого мне, видимо, нужно больше “репутации” - так что он получит новый ответ).

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

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

Invoke-WebRequest http://localhost -UseBasicParsing
```.

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

3
19
10
28
5