PowerShell équivalent à curl

146

Existe-t-il un équivalent de curldans PowerShell? At-il une capacité intégrée similaire ou existe-t-il une applet de commande tierce?

Borek Bernard
la source
5
Fermé? Que diriez-vous de la fermeture de superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… et de l'hôte d'autres?
Borek Bernard
1
En fait, cette question me semble juste? Mais il y a une vieille réponse: stackoverflow.com/questions/340553/…
Rup
1
Consultez cet article sur l'utilisation de curl dans PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Réponses:

100

PowerShell 3.0 a la nouvelle commande Invoke-RestMethod:

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

plus de détails:

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

Michael Kelley
la source
8
Vous voudrez peut-être utiliser la commande Invoke-WebRequest, selon ce que vous essayez d'accomplir.
Timothy Lee Russell
28
Il est également alias comme curlou wgetdans Powershell maintenant.
CMCDragonkai
18
Ouais, c’est bizarre qu’ils les appellent, car la syntaxe est complètement différente. Si MS ne veut pas envoyer un gestionnaire de paquets et faciliter la tâche pour se familiariser avec les outils de base courants, le cacher derrière un faux alias ne va pas améliorer la situation.
MichaelGG
1
Le plus gros problème avec Invoke-WebRequest est qu'il ne fonctionne pas si IE n'est pas "initialisé"; Par conséquent, lorsque vous écrivez des scripts de pipeline ou DSC, vous devez d'abord effectuer des démarches supplémentaires ou vous pouvez utiliser Invoke-RestMethod.
LimpingNinja
1
@LimpingNinja, avez-vous une source pour cela? Le problème que vous avez rencontré est peut-être dû à ceci: "-UseBasicParsing Utilise l'objet de réponse pour le contenu HTML sans analyse DOM (Document Object Model). Ce paramètre est requis lorsque Internet Explorer n'est pas installé sur les ordinateurs, par exemple sur une installation Server Core. d’un système d’exploitation Windows Server ". de msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

À partir de Powershell 5.0, sinon avant, curlest un alias pour 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

Pour utiliser la commande sans alias ...

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

Renvoyez donc plusieurs propriétés de la requête comme suit ...

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

... ou juste le contenu ...

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

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

Les commandes équivalentes aliasées sont ...

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

En utilisant les valeurs par défaut de Powershell et d’autres alias, vous pouvez raccourcir les commandes pour

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

... mais je ne le recommanderais pas. Les commandes verbeuses aident les autres lors de la lecture de votre code.

Mise à jour:

Powershell 6.x

Utilisation d'alias découragée

A partir de Powershell 6.x, "Core" curl n'est plus un alias Invoke-WebRequest(l'alias wgetest également supprimé). Utilisez plutôt Invoke-WebRequestdirectement.

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

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

Curl n'est plus un alias pour Invoke-WebRequest (testé sur Powershell 6.2.3), malgré le rejet apparent d'une requête dans un RFC "visant à supprimer les alias curl et wget de Windows PowerShell" .

La RFC note que "les alias wget / curl ont déjà été supprimés de PowerShell Core, de sorte que le problème [d'avoir ces alias] était limité à Windows PowerShell".

En conclusion, l'équipe de Powershell encourage également les utilisateurs "à ne pas s'appuyer sur des alias dans les scripts".

Comme @ v6ak l'a noté dans les commentaires, utiliser curlet wgetdans PowerShell (5.0 ou une version inférieure) peut poser un problème: en invoquant involontairement le véritable curl ou wget s'il est installé côte à côte; et, dans tous les cas, crée de la confusion.

Nouveau codage

Il est recommandé de mettre à jour Powershell "core" (version 6.x ou supérieure) afin de tirer parti du codage par défaut utf8NoBOMlors de l’utilisation Invoke-WebRequest(et de nombreuses autres commandes de sortie de texte). Si quelqu'un le faisait explicitement, vous pourriez faire quelque chose comme:

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 

Cependant, même si vous utilisez une commande plus courte, implicite ...

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

... l'encodage avec utf8NoBOMsera effectué (vous pouvez le vérifier, par exemple, en ouvrant le fichier enregistré dans Visual Studio Code et en observant "UTF-8" dans la barre d'état).

Les fichiers enregistrés avec utf8NoBOMont tendance à causer moins de problèmes lors de vos déplacements dans divers écosystèmes. Bien sûr, si vous avez besoin d'un autre encodage, vous pouvez définir explicitement une alternative.

Dans Powershell 5.0 et inférieur, l’ utf8NoBOMencodage n’était pas disponible, encore moins par défaut.

Détails:

John Bentley
la source
Qu'est-ce que le drapeau -Uri fait ... J'obtiens les mêmes résultats avec ou sans "curl -Uri api.github.com/rate_limit ". J'ai cherché ceci, mais je ne suis toujours pas sûr
Drenai
1
Dans PowerShell, certains noms de paramètres peuvent être déduits implicitement de l'ordre des valeurs de paramètres. Vous pouvez voir cela en regardant get-help curl. Vous verrez Invoke-WebRequest [-Uri] <Uri> ..., avec les crochets []indiquant -Uripeut être omis (et donc implicitement invoqué). Comme je l'ai mentionné dans l'article principal: en général, vous devez être explicite (à savoir si vous ou d'autres allez lire votre code à l'avenir).
John Bentley
Ah merci. Donc, je le laisse de côté, mais on l'invoque toujours, je ne savais pas que c'était ce []qui se
passait
Je vous en prie. Vous l'avez. La description de la syntaxe des commandes powershell que vous trouvez get-helpest donnée dans certaines versions de en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Vous ferez bien de lire / survoler cela car une version de Extended Backus Naur Form est probablement utilisée pour décrire la syntaxe de nombreuses langues que vous rencontrerez. Vous remarquerez qu’en fr.wikipedia.org/wiki/…, les crochets [ ...]désignent une syntaxe facultative.
John Bentley
C'est, mais je suggère de ne pas l'utiliser, car c'est déroutant. Sur PowerShell Core 6.1.3 pour Linux, ni curl ni wget ne sont les alias. Ils font référence aux curl et wget d'origine (s'ils sont présents dans le système). Comme ils sont différents, l'utilisation de ces alias est une source potentielle de confusion et de scripts non multiplateformes.
v6ak
29

L'excellent blog Command Line Kung Fu contient un article dans lequel ils comparent curl, wget et les commandes PowerShell associées.

En un mot:

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

Ou, si votre version de Powershell / .Net n'accepte pas 2 paramètres pour DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
la source
Cette réponse mentionne la DownloadFilefonction qui fonctionne bien aussi.
Paul Hicks
15

Vous pouvez également installer Git pour Windows , puis placer le dossier Git bin dans votre chemin. L'installation de Git inclut, entre autres, curl.exe. Après l’installation, il suffit de mettre %programfiles(x86)%\git\bindans votre PATH. Vous pourrez ensuite utiliser la commande curl à partir de l'invite de commande Windows ou de la console PowerShell.

Jamie
la source
1

la chose la plus proche de wgetou curlsur Windows est le bit (service de transfert intelligent en arrière-plan), qui contient des extraits prêts à être utilisés dans PowerShell.

Akira
la source
3
Je pense que BITS résout un problème différent de wget ou curl.
Donald Byrd
Récupérer des objets depuis un serveur HTTP?
Akira
2
Non :), l'intelligence de base en fait partie.
Donald Byrd
0

boucle

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
la source