PowerShell-Äquivalent zu Curl

146

Gibt es ein Äquivalent zu curlin PowerShell? Verfügt es über eine ähnliche integrierte Funktion oder gibt es ein Cmdlet eines Drittanbieters?

Borek Bernard
quelle
5
Geschlossen? Wie wäre es mit dem Schließen von superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… und vielen anderen?
Borek Bernard
1
Eigentlich sieht diese Frage für mich fair genug aus? Aber es gibt eine alte Antwort: stackoverflow.com/questions/340553/…
Rup
1
Sie in diesem Artikel über die Verwendung von curl in Powershell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Antworten:

100

PowerShell 3.0 verfügt über den neuen Befehl Invoke-RestMethod:

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

Mehr Details:

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

Michael Kelley
quelle
8
Möglicherweise möchten Sie stattdessen den Befehl Invoke-WebRequest, je nachdem, was Sie erreichen möchten.
Timothy Lee Russell
28
Es ist jetzt auch als curloder wgetin Powershell aliasiert .
CMCDragonkai
18
Ja, es ist bizarr, dass sie einen Alias ​​haben, da die Syntax völlig anders ist. Wenn MS keinen Paketmanager ausliefern und es einfach machen möchte, allgemeine, grundlegende Tools zu erhalten, wird dies die Situation nicht verbessern, wenn Sie es hinter einem falschen Alias ​​verstecken.
MichaelGG
1
Das größte Problem bei Invoke-WebRequest ist, dass es nicht funktioniert, wenn der IE nicht "initialisiert" ist. Wenn Sie also Pipeline- oder DSC-Skripte schreiben, müssen Sie zuerst einige zusätzliche Schritte ausführen, oder Sie können Invoke-RestMethod verwenden.
LimpingNinja
1
@LimpingNinja, hast du eine Quelle dafür? Möglicherweise lag das Problem daran: "-UseBasicParsing Verwendet das Antwortobjekt für HTML-Inhalte ohne DOM-Analyse (Document Object Model). Dieser Parameter ist erforderlich, wenn Internet Explorer nicht auf Computern installiert ist, z. B. bei einer Server Core-Installation eines Windows Server-Betriebssystems. " von msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

Ab Powershell 5.0 ist, wenn nicht schon früher, curlein Alias ​​für 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

So verwenden Sie den Befehl "unalias":

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

So geben Sie mehrere Eigenschaften der Anfrage wie folgt zurück ...

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

... oder nur der Inhalt ...

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

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

Die entsprechenden Alias-Befehle lauten ...

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

Wenn Sie die Powershell-Standardeinstellungen und andere Aliase nutzen, können Sie die Befehle auf verkürzen

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

... aber ich würde es nicht empfehlen. Ausführliche Befehle helfen anderen beim Lesen Ihres Codes.

Aktualisieren:

Powershell 6.x

Die Verwendung von Aliasnamen wird nicht empfohlen

Ab Powershell 6.x ist "Core" curl kein Alias ​​mehr für Invoke-WebRequest(der Alias wgetwird auch entfernt). Verwenden Sie stattdessen Invoke-WebRequestdirekt.

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

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

Curl ist nicht länger ein Alias ​​für Invoke-WebRequest (getestet auf Powershell 6.2.3), obwohl ein Antrag in einem RFC anscheinend abgelehnt wurde, "die Aliase Curl und Wget aus Windows PowerShell zu entfernen" .

RFC-Hinweis "Die wget / curl-Aliase wurden bereits aus PowerShell Core entfernt, sodass das Problem [mit diesen Aliasen] auf Windows PowerShell beschränkt war."

Abschließend ruft das Powershell-Team die Benutzer dazu auf, "sich nicht auf Aliase in Skripten zu verlassen".

Wie @ v6ak in den Kommentaren unter curlund wgetin PowerShell (5.0 oder niedriger) angemerkt hat, kann dies ein Problem sein bei: unbeabsichtigtem Aufrufen der echten Wellung oder Wget, wenn diese Seite an Seite installiert werden; und verursacht in jedem Fall Verwirrung.

Neue Codierung

Es wird empfohlen, Powershell "core" (6.x oder höher) zu aktualisieren, um die Standardcodierung utf8NoBOMbei Verwendung Invoke-WebRequest(und vielen anderen Textausgabebefehlen) zu nutzen. Wenn man das explizit machen würde, könnte man so etwas machen:

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 

Aber selbst wenn ein kürzerer, impliziter Befehl verwendet wird ...

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

Die Codierung mit utf8NoBOMwird ausgeführt (Sie können dies überprüfen, indem Sie beispielsweise die gespeicherte Datei in Visual Studio Code öffnen und "UTF-8" in der Statusleiste beobachten).

Dateien, die mit gespeichert wurden utf8NoBOM, verursachen in der Regel weniger Probleme, wenn Sie durch verschiedene Ökosysteme reisen. Wenn Sie eine andere Codierung benötigen, können Sie natürlich eine Alternative explizit festlegen.

In Powershell 5.0 und niedriger war die utf8NoBOMCodierung nicht verfügbar, geschweige denn die Standardeinstellung.

Einzelheiten:

John Bentley
quelle
Was macht die -Uri-Flagge ... Ich erhalte die gleichen Ergebnisse mit oder ohne sie für 'curl -Uri api.github.com/rate_limit '. Ich habe danach gesucht, bin mir aber immer noch nicht sicher
Drenai
1
In Powershell können einige Parameternamen implizit aus der Reihenfolge der Parameterwerte abgeleitet werden. Sie können dies durch Betrachten sehen get-help curl. Sie werden sehen Invoke-WebRequest [-Uri] <Uri> ..., dass die Klammern []weggelassen werden -Urikönnen (und daher implizit aufgerufen werden). Wie ich im Hauptbeitrag erwähnt habe: Im Allgemeinen sollten Sie explizit angeben (wo Sie oder andere Ihren Code in Zukunft lesen werden).
John Bentley
Ah danke. Also lasse ich es aus, aber es wird immer noch angerufen, wusste nicht, was das []getan hat
Drenai
Bitte schön. Du hast es. Die Syntaxbeschreibungen für Powershell-Befehle, die Sie in finden, finden Sie get-helpin einer Version von en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Sie sollten dies gut lesen / überfliegen, da einige Versionen von Extended Backus Naur Form wahrscheinlich zur Beschreibung der Syntax vieler Sprachen verwendet werden, auf die Sie stoßen werden. Sie werden feststellen, dass unter en.wikipedia.org/wiki/… in Klammern [ ...]die Syntax angegeben ist, die optional ist.
John Bentley
Es ist, aber ich schlage vor, es nicht zu verwenden, da es verwirrend ist. In PowerShell Core 6.1.3 für Linux sind die Aliase weder Curl noch Wget. Sie beziehen sich auf die ursprüngliche Locke und Wolle (sofern sie im System vorhanden sind). Da sie unterschiedlich sind, kann die Verwendung dieser Aliase zu Verwirrung führen und Skripte ohne mehrere Plattformen verursachen.
v6ak
29

Der ausgezeichnete Blog Command Line Kung Fu enthält einen Beitrag, in dem Curl, Wget und die zugehörigen PowerShell-Befehle verglichen werden

In einer Nussschale:

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

Oder wenn Ihre Version von Powershell / .Net keine 2 Parameter akzeptiert für DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
quelle
Diese Antwort erwähnt die DownloadFileFunktion, die auch gut funktioniert.
Paul Hicks
15

Sie können Git auch für Windows installieren und dann den Ordner Git bin in Ihren Pfad einfügen. Die Git-Installation beinhaltet unter anderem curl.exe. Geben Sie nach der Installation einfach %programfiles(x86)%\git\binIhren PFAD ein. Dann können Sie den Befehl curl über die Windows-Eingabeaufforderung oder die PowerShell-Konsole verwenden.

Jamie
quelle
1

die nächste Sache, wgetoder curlan Fenstern ist Bits (Background Intelligent Transfer Service), die einige Schnipsel bereit für Powershell hat.

Akira
quelle
3
Ich denke, BITS löst ein anderes Problem als Wget oder Curl.
Donald Byrd
Dinge von einem HTTP-Server holen?
Akira
2
Nein :), die Hintergrundinformationen gehören dazu.
Donald Byrd
0

locken

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

Power Shell

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
quelle