Odpowiednik curl w programie PowerShell

145

Czy istnieje odpowiednik programu curlPowerShell? Czy ma podobne wbudowane możliwości, czy jest też polecenie cmdlet innej firmy?

Borek Bernard
źródło
5
Zamknięte? Co powiesz na zamknięcie superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/... i wielu innych?
Borek Bernard,
1
Właściwie to pytanie wydaje mi się wystarczająco sprawiedliwe? Ale jest stara odpowiedź: stackoverflow.com/questions/340553/…
Rup
1
Sprawdź ten artykuł na temat używania curl w PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Odpowiedzi:

100

Program PowerShell 3.0 ma nowe polecenie Invoke-RestMethod:

http://technet.microsoft.com/en-us/library/hh849971.aspx

więcej szczegółów:

https://discoposse.com/2012/06/30/powershell-invoke-restmethod-putting-the-curl-in-your-shell/

Michael Kelley
źródło
8
Zamiast tego możesz chcieć użyć komendy Invoke-WebRequest, w zależności od tego, co próbujesz osiągnąć.
Timothy Lee Russell,
28
Teraz jest także aliasowany jako curllub wgetw Powershell.
CMCDragonkai
18
Tak, to dziwne, że je aliasy, ponieważ składnia jest zupełnie inna. Jeśli stwardnienie rozsiane nie chce wysłać menedżera paczek i ułatwić rozpowszechnienie podstawowych narzędzi, ukrywanie go pod fałszywym aliasem nie poprawi sytuacji.
MichaelGG
1
Największym problemem związanym z Invoke-WebRequest jest to, że nie działa, jeśli IE nie jest „zainicjowany”; więc pisząc skrypty potoku lub DSC, musisz najpierw wykonać dodatkowe prace nóg lub użyć Invoke-RestMethod.
LimpingNinja
1
@LimpingNinja, czy masz na to źródło? Być może problem, który napotkałeś, był spowodowany przez: „-UseBasicParsing Używa obiektu odpowiedzi dla treści HTML bez analizowania modelu dokumentu obiektu (DOM). Ten parametr jest wymagany, gdy Internet Explorer nie jest zainstalowany na komputerach, na przykład podczas instalacji Server Core systemu operacyjnego Windows Server. ” from msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

Począwszy od Powershell 5.0, jeśli nie wcześniej, curljest to alias dla 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

Aby użyć niezmienionego polecenia ...

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

Zwróć więc kilka właściwości żądania w następujący sposób ...

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

... lub po prostu treść ...

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

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

Równoważne polecenia aliasu to ...

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

Wykorzystując wartości domyślne programu PowerShell i inne aliasy, do których możesz skrócić polecenia

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

... ale nie poleciłbym tego. Pełne polecenia pomagają innym podczas odczytywania kodu.

Aktualizacja:

PowerShell 6.x

Odradzane jest używanie aliasów

Począwszy od Powershell 6.x „Core” curl nie jest już aliasem dla Invoke-WebRequest(alias wgetjest również usuwany). Zamiast tego użyj Invoke-WebRequestbezpośrednio.

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

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

Curl nie jest już aliasem dla Invoke-WebRequest (testowany w Powershell 6.2.3), pomimo pozornego odrzucenia ruchu w RFC „aby usunąć curl i wget z Windows PowerShell” .

RFC zauważa: „Aliasy wget / curl zostały już usunięte z programu PowerShell Core, więc problem [posiadania tych aliasów] ograniczał się do Windows PowerShell”.

Podsumowując, zespół Powershell zachęca również użytkowników, by „nie polegali na aliasach w skryptach”.

Jak zauważył @ v6ak w komentarzach przy użyciu curliw programie wgetPowerShell (5.0 lub nowszym ) może być problem w: niezamierzonym wywołaniu prawdziwego zwijania lub wget, jeśli jest instalowany obok siebie; i w każdym razie powoduje zamieszanie.

Nowe kodowanie

Zaleca się aktualizację „rdzenia” programu PowerShell (6.x lub nowszy), aby skorzystać z domyślnego kodowania utf8NoBOMpodczas używania Invoke-WebRequest(i wielu innych poleceń do wysyłania tekstu). Jeśli ktoś robi to wprost, możesz zrobić coś takiego:

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 

Jednak nawet przy użyciu krótszego, domyślnego polecenia ...

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

... utf8NoBOMzostanie wykonane kodowanie za pomocą (możesz to zweryfikować, na przykład otwierając zapisany plik w programie Visual Studio Code i obserwując „UTF-8” na pasku stanu).

Pliki zapisane za pomocą utf8NoBOMzwykle powodują mniej problemów podczas podróży przez różne ekosystemy. Oczywiście, jeśli potrzebujesz innego kodowania, możesz jawnie ustawić alternatywę.

W Powershell 5.0 i niższych utf8NoBOMkodowanie nie było dostępne, nie mówiąc już o domyślnym.

Detale:

John Bentley
źródło
Co robi flaga -Uri ... Uzyskuję takie same wyniki z lub bez dla „curl -Uri api.github.com/rate_limit ”. Szukałem tego, ale nadal nie jestem pewien
Drenai
1
W programie PowerShell niektóre nazwy parametrów można niejawnie wyprowadzać z kolejności wartości parametrów. Możesz to zobaczyć patrząc na get-help curl. Zobaczysz Invoke-WebRequest [-Uri] <Uri> ..., ze nawiasami []wskazującymi -Urimożna pominąć (i dlatego niejawnie wywołać). Jak wspomniałem w głównym poście: ogólnie powinieneś być wyraźny (tam, gdzie ty lub inni zamierzacie przeczytać swój kod w przyszłości).
John Bentley
Ach - dzięki. Więc odchodzę go, ale to nadal jest wywoływany, nie wiedział, że to, co []zrobił
Drenajów
Zapraszamy. Masz to. Opisy składni komend programu PowerShell, które można znaleźć, znajdują get-helpsię w niektórych wersjach en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Zrobisz to dobrze, czytając / przeglądając to, ponieważ pewna wersja formularza Extended Backus Naur Form jest prawdopodobnie używana do opisania składni wielu języków, które napotkasz. Zauważysz, że na en.wikipedia.org/wiki/… nawiasy [ ...]oznaczają składnię, która jest opcjonalna.
John Bentley,
Jest, ale sugeruję, aby go nie używać, ponieważ jest mylący. W PowerShell Core 6.1.3 dla Linuksa ani curl, ani wget nie są aliasami. Odnoszą się do oryginalnego zwijania i wget (jeśli są obecne w systemie). Ponieważ są one różne, użycie tych aliasów jest potencjalnym źródłem nieporozumień i skryptów innych niż wieloplatformowe.
v6ak
29

Doskonały blog Kung Fu z wiersza poleceń zawiera post, w którym porównuje curl, wget i powiązane polecenia PowerShell

W skrócie:

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

Lub, jeśli twoja wersja Powershell / .Net nie akceptuje 2 parametrów dla DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
źródło
Ta odpowiedź wspomina o DownloadFilefunkcji, która również działa dobrze.
Paul Hicks
15

Możesz również zainstalować Git dla Windows , a następnie umieścić folder Git bin na swojej ścieżce. Instalacja Git obejmuje między innymi curl.exe. Po instalacji, po prostu %programfiles(x86)%\git\binwprowadź swoją ŚCIEŻKĘ. Następnie będziesz mógł użyć polecenia curl z wiersza polecenia systemu Windows lub konsoli PowerShell.

Jamie
źródło
1

najbliższą rzeczą wgetlub curlw systemie Windows są bity (Usługa inteligentnego transferu w tle), która ma kilka fragmentów gotowych na PowerShell.

akira
źródło
3
Myślę, że BITS rozwiązuje inny problem niż wget lub curl.
Donald Byrd,
Pobieranie rzeczy z serwera HTTP?
akira
2
Nie :), część wywiadu w tle.
Donald Byrd,
0

kędzior

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
Archon
źródło