PowerShell еквівалент завитка


145

Чи є еквівалент curlPowerShell? Чи є у неї подібні вбудовані можливості або є сторонній командлет?


5
Зачинено? Як щодо закриття superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… та багатьох інших?
Борек Бернар

1
Насправді це питання мені здається справедливим? Але є стара відповідь: stackoverflow.com/questions/340553/…
Rup

1
Перевірте цю статтю про використання завитка в PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Відповіді:


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 "Core" 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 або нижче) може бути проблемою в: ненавмисному виклику справжнього завитка або wget, якщо встановлено поруч; і, в будь-якому випадку, викликає плутанину.

Нове кодування

Рекомендується оновити "core" 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
В оболонках повноважень деякі назви параметрів можуть бути неявно отримані з порядку значень параметрів. Це можна побачити, переглянувши get-help curl. Ви побачите Invoke-WebRequest [-Uri] <Uri> ..., що дужки, що []вказують, -Uriможуть бути опущені (і тому неявно викликані). Як я вже згадував у головному дописі: загалом ви повинні бути чіткими (де ви чи інші люди будете читати свій код у майбутньому).
Джон Бентлі

Ах - спасибі. Тож я покидаю це, але все ще на []нього
звертаються

Будь ласка. Ви це отримали. Описи синтаксису для команд shellhell, які ви знайдете get-help, наведені в деякій версії en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Ви будете добре читати / перебирати це, оскільки деяка версія Extended Backus Naur Form, ймовірно, використовується для опису синтаксису багатьох мов, які ви зустрінете. Ви помітите, що в дужках en.wikipedia.org/wiki/… дужки [ ...]позначають синтаксис, який не є обов'язковим.
Джон Бентлі

Так є, але я пропоную не використовувати його, оскільки це заплутано. У PowerShell Core 6.1.3 для Linux псевдоніми не є ні curl, ні wget. Вони посилаються на оригінал curl і wget (якщо вони присутні в системі). Оскільки вони різні, використання цих псевдонімів є потенційним джерелом плутанини та не мультиплатформних сценаріїв.
v6ak

29

У відмінному блозі Command Line 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свій PATH. Тоді ви зможете використовувати команду curl з командної лінії Windows або консолі PowerShell.



1

Найближче до Windows wgetабо бітcurl - це біти (Background Intelligent Transfer Service), у яких є кілька фрагментів, готових до передачі повноважень.


3
Я думаю, що BITS вирішує іншу проблему, ніж wget або curl.
Дональд Берд

Виймання речей з Http-сервера?
akira

2
Ні :), основна частина його інтелектуальної частини.
Дональд Берд


0

завиток

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

повноваження

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.