PowerShell эквивалент скручивания


146

Есть ли эквивалент curlв PowerShell? Есть ли у него похожая встроенная возможность или есть сторонний командлет?


5
Закрыто? Как насчет закрытия superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… и множества других?
Борек Бернард

1
На самом деле этот вопрос выглядит достаточно справедливым для меня? Но есть старый ответ: stackoverflow.com/questions/340553/…
Rup

Ответы:


100

8
Вместо этого вы можете захотеть использовать команду Invoke-WebRequest, в зависимости от того, что вы пытаетесь выполнить.
Тимоти Ли Рассел

28
Это также псевдоним как curlили wgetв Powershell сейчас.
CMCDragonkai

18
Да, это странно, что они их псевдоним, так как синтаксис совершенно другой. Если MS не хочет поставлять диспетчер пакетов и облегчать получение общих, базовых инструментов, скрытие их за поддельным псевдонимом не улучшит ситуацию.
MichaelGG

1
Самая большая проблема с Invoke-WebRequest заключается в том, что он не работает, если IE не «инициализирован»; поэтому при написании конвейера или сценариев DSC сначала необходимо выполнить дополнительную работу или использовать Invoke-RestMethod.
LimpingNinja

1
@LimpingNinja, у тебя есть источник для этого? Возможно, проблема возникла из-за этого: "-UseBasicParsing Использует объект ответа для содержимого HTML без анализа объектной модели документов (DOM). Этот параметр необходим, если Internet Explorer не установлен на компьютерах, например, при установке Server Core. операционной системы Windows Server. " с msdn.microsoft.com/powershell/reference/3.0/…
Майкл Келли

42

Начиная с Powershell 5.0, если не раньше, curlэто псевдоним для Invoke-WebRequest.

PS> Get-Alias -Definition Invoke-WebRequest | Format-Table -AutoSize

CommandType Name                      Version Source
----------- ----                      ------- ------
Alias       curl -> Invoke-WebRequest
Alias       iwr -> Invoke-WebRequest
Alias       wget -> Invoke-WebRequest

Чтобы использовать несвязанную команду ...

PS> Invoke-WebRequest -Uri https://localhost:443/
PS> Invoke-WebRequest -Uri https://www.google.com

Поэтому верните несколько свойств запроса следующим образом ...

PS> Invoke-WebRequest -Uri https://www.google.com

StatusCode        : 200
StatusDescription : OK
Content           : <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en-AU"><head><meta content="text/html; charset=UTF-8"
                    http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/...
RawContent        : HTTP/1.1 200 OK
                    X-XSS-Protection: 1; mode=block
                    X-Frame-Options: SAMEORIGIN
                    Vary: Accept-Encoding

... или просто содержание ...

PS> Invoke-WebRequest -Uri https://www.google.com | Select-Object -ExpandProperty Content

<!doctype html><html itemscope="" itemtype="http://schem[etc ...]

Эквивалентные команды с псевдонимами ...

PS> curl -Uri https://www.google.com
PS> curl -Uri https://www.google.com | Select-Object -ExpandProperty Content

Используя значения по умолчанию Powershell и другие псевдонимы, вы можете сократить команды до

PS> curl https://www.google.com 
ps> curl https://www.google.com | Select -ExpandProperty Content

... но я бы не рекомендовал это. Подробные команды помогают другим при чтении вашего кода.

Обновить:

Powershell 6.x

Использование псевдонимов не рекомендуется

Начиная с Powershell 6.x «Ядро» curl больше не является псевдонимом для Invoke-WebRequest(псевдоним wgetтакже удаляется). Вместо этого используйте Invoke-WebRequestнапрямую.

PS> Get-Alias -Definition Invoke-WebRequest | Format-Table -AutoSize

CommandType Name                     Version Source
----------- ----                     ------- ------
Alias       iwr -> Invoke-WebRequest

Curl больше не является псевдонимом для Invoke-WebRequest (протестирован на Powershell 6.2.3), несмотря на очевидное отклонение предложения в RFC «удалить псевдонимы curl и wget из Windows PowerShell» .

В RFC отмечается: «Псевдонимы wget / curl уже удалены из PowerShell Core, поэтому проблема с наличием этих псевдонимов была ограничена Windows PowerShell».

В заключение команда Powershell также призывает пользователей «не полагаться на псевдонимы в сценариях».

Как отметил @ v6ak в комментариях, использование curlи wgetв PowerShell (5.0 или ниже) может вызвать проблемы в: непреднамеренном вызове реального curl или wget, если он установлен рядом; и, в любом случае, вызывает путаницу.

Новая кодировка

Рекомендуется обновить «ядро» Powershell (6.x или выше), чтобы использовать преимущества кодировки по умолчанию utf8NoBOMпри использовании Invoke-WebRequest(и многих других команд вывода текста). Если кто-то делал это явно, вы могли бы сделать что-то вроде:

Invoke-WebRequest ` 
-Uri https://raw.githubusercontent.com/fancyapps/fancybox/master/dist/jquery.fancybox.min.js `
| Select-Object -ExpandProperty Content `
| Out-File jquery.fancybox.min.js `
-Encoding utf8NoBOM 

Однако даже при использовании более короткой неявной команды ...

Invoke-WebRequest `
-Uri https://raw.githubusercontent.com/fancyapps/fancybox/master/dist/jquery.fancybox.min.js `
-OutFile jquery.fancybox.min.js

... utf8NoBOMбудет выполнено кодирование с помощью (вы можете проверить это, например, открыв сохраненный файл в коде Visual Studio и наблюдая «UTF-8» в строке состояния).

Сохраненные файлы, utf8NoBOMкак правило, вызывают меньше проблем при путешествии по различным экосистемам. Конечно, если вам нужна какая-то другая кодировка, вы можете явно указать альтернативу.

В Powershell 5.0 и ниже utf8NoBOMкодировка была недоступна, не говоря уже о настройке по умолчанию.

Подробности:


Что делает флаг -Uri ... Я получаю одинаковые результаты с или без него для 'curl -Uri api.github.com/rate_limit '. Я искал это, но все еще не уверен
Дренаи

1
В powershell некоторые имена параметров могут быть неявно получены из порядка значений параметров. Вы можете увидеть это, посмотрев на get-help curl. Вы увидите Invoke-WebRequest [-Uri] <Uri> ..., что скобки, []указывающие, -Uriмогут быть опущены (и, следовательно, неявно вызваны). Как я упоминал в основном посте: в общем, вы должны быть явными (где вы или другие собираетесь читать ваш код в будущем).
Джон Бентли

Ах, спасибо. Так что я оставляю это, но это все еще вызывается, не знал, что именно это []сделал
Дренаи

Добро пожаловать. У тебя вышло. Описания синтаксиса для команд PowerShell, которые вы найдете, get-helpприведены в некоторых версиях en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Вы преуспеете, чтобы прочитать / просмотреть это, потому что некоторая версия расширенной формы Backus Naur, вероятно, используется для описания синтаксиса многих языков, с которыми вы столкнетесь. Вы заметите, что на en.wikipedia.org/wiki/… скобки [ ...]обозначают необязательный синтаксис.
Джон Бентли

Это так, но я предлагаю не использовать его, поскольку это сбивает с толку. В PowerShell Core 6.1.3 для Linux ни curl, ни wget не являются псевдонимами. Они ссылаются на оригинальный curl и wget (если они присутствуют в системе). Поскольку они различаются, использование этих псевдонимов является потенциальным источником путаницы и не мультиплатформенных сценариев.
v6ak

29

В отличном блоге о командной строке Kung Fu есть пост, в котором сравниваются curl, wget и связанные с ним команды PowerShell.

В двух словах:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html","C:\hello-world.html")

Или, если ваша версия Powershell / .Net не принимает 2 параметра для DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"

Этот ответ упоминает DownloadFileфункцию, которая также работает хорошо.
Пол Хикс

15

Вы также можете установить Git для Windows , а затем поместить папку Git bin в свой путь. Установка Git включает, помимо прочего, curl.exe. После установки просто %programfiles(x86)%\git\binвведите ваш путь. После этого вы сможете использовать команду curl из командной строки Windows или консоли PowerShell.



1

ближе всего к окнам wgetили curlк ним есть биты (Background Intelligent Transfer Service), у которых есть некоторые фрагменты, готовые для powershell.


3
Я думаю, что BITS решает другую проблему, чем Wget или Curl.
Дональд Берд

Извлекать вещи с Http-сервера?
Акира

2
Нет :), фоновая разведывательная часть этого.
Дональд Берд


0

локон

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

PowerShell

Invoke-WebRequest -H @{"Host"="whoami.local"} -UseBasicParsing 192.168.4.4

# or 
# $(Get-Command curl) return  "curl -> Invoke-WebRequest"
curl -H @{"Host"="whoami.local"} -UseBasicParsing 192.168.4.4
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.