PowerShell equivalente de curl

146

¿Hay un equivalente de curlen PowerShell? ¿Tiene alguna capacidad incorporada similar o hay un cmdlet de terceros?

Borek Bernard
fuente
55
¿Cerrado? ¿Qué hay de cerrar superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… y muchos otros?
Borek Bernard
1
¿En realidad esta pregunta me parece bastante justa? Pero hay una vieja respuesta: stackoverflow.com/questions/340553/…
Rup
1
Echa un vistazo a este artículo sobre el uso de rizo en PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Respuestas:

100

PowerShell 3.0 tiene el nuevo comando Invoke-RestMethod:

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

mas detalle:

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

Michael Kelley
fuente
8
Es posible que desee el comando Invoke-WebRequest en su lugar, dependiendo de lo que esté tratando de lograr.
Timothy Lee Russell
28
También tiene alias como curlo wgeten Powershell ahora.
CMCDragonkai
18
Sí, es extraño que los alias, ya que la sintaxis es completamente diferente. Si MS no quiere enviar un administrador de paquetes y hacer que sea fácil obtener herramientas básicas y comunes, esconderlo detrás de un alias falso no mejorará la situación.
MichaelGG
1
El mayor problema con Invoke-WebRequest es que no funciona si IE no está 'inicializado'; así que al escribir scripts de canalización o DSC, primero debe hacer un trabajo extra o puede usar Invoke-RestMethod.
LimpingNinja
1
@LimpingNinja, ¿tienes una fuente para esto? Tal vez el problema que experimentó se debió a esto: "-UseBasicParsing Usa el objeto de respuesta para contenido HTML sin el análisis del Modelo de Objetos del Documento (DOM). Este parámetro es necesario cuando Internet Explorer no está instalado en las computadoras, como en una instalación Server Core de un sistema operativo Windows Server ". de msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

A partir de Powershell 5.0, si no antes, curles un alias para 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

Para usar el comando sin alias ...

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

Por lo tanto, devuelva varias propiedades de la solicitud de la siguiente manera ...

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

... o solo el contenido ...

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

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

Los comandos con alias equivalentes son ...

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

Aprovechando los valores predeterminados de Powershell y otros alias, puede acortar los comandos a

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

... pero no lo recomendaría. Los comandos detallados ayudan a otros cuando leen su código.

Actualizar:

Powershell 6.x

Se desaconseja el uso de alias

A partir de Powershell 6.x "Core" curl ya no es un alias para Invoke-WebRequest(el alias wgettambién se elimina). En lugar de usar Invoke-WebRequestdirectamente.

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

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

Curl ya no es un alias para Invoke-WebRequest (probado en Powershell 6.2.3), a pesar de un aparente rechazo de un movimiento en un RFC "para eliminar los alias curl y wget de Windows PowerShell" .

Ese RFC señala que "los alias wget / curl ya se eliminaron de PowerShell Core, por lo que el problema [de tener esos alias] se limitó a Windows PowerShell".

En conclusión, el equipo de Powershell también alienta a los usuarios a "no confiar en los alias en los scripts".

Como ha notado @ v6ak en los comentarios, usar curly wgeten PowerShell (5.0 o inferior) puede ser un problema en: invocar involuntariamente el curl o wget real si se instala uno al lado del otro; y, en cualquier caso, causa confusión.

Nueva codificación

Se recomienda actualizar Powershell "core" (6.xo superior) para aprovechar la codificación predeterminada utf8NoBOMcuando se utiliza Invoke-WebRequest(y muchos otros comandos de salida de texto). Si uno estuviera haciendo esto explícitamente, podría hacer algo como:

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 

Sin embargo, incluso cuando se usa un comando más corto e implícito ...

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

... se realizará la codificación con utf8NoBOM(puede verificar esto, por ejemplo, abriendo el archivo guardado en Visual Studio Code y observando "UTF-8" en la barra de estado).

Los archivos guardados utf8NoBOMtienden a causar menos problemas al viajar a través de varios ecosistemas. Por supuesto, si necesita otra codificación, puede establecer alguna alternativa explícitamente.

En Powershell 5.0 y utf8NoBOMversiones anteriores, la codificación no estaba disponible, y mucho menos la predeterminada.

Detalles:

John Bentley
fuente
¿Qué está haciendo la bandera -Uri? Obtengo los mismos resultados con o sin ella para 'curl -Uri api.github.com/rate_limit '. He buscado esto, pero todavía no estoy seguro
Drenai
1
En powershell, algunos nombres de parámetros pueden derivarse implícitamente del orden de los valores de los parámetros. Puedes ver esto mirando get-help curl. Verá Invoke-WebRequest [-Uri] <Uri> ..., con los corchetes []indicando que -Uripuede omitirse (y por lo tanto invocarse implícitamente). Como mencioné en la publicación principal: en general, debe ser explícito (dónde usted u otros leerán su código en el futuro).
John Bentley
Ah gracias. Así que lo dejo afuera, pero todavía está siendo invocado, no sabía que eso era lo que []hizo
Drenai
De nada. Tu lo tienes. Las descripciones de sintaxis para los comandos de PowerShell que encontrará get-helpse dan en alguna versión de en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Hará bien en leer / leer eso porque alguna versión de Extended Backus Naur Form probablemente se use para describir la sintaxis de muchos idiomas con los que se encontrará. Notarás que en en.wikipedia.org/wiki/… los corchetes [ ...]designan la sintaxis que es opcional.
John Bentley
Lo es, pero sugiero no usarlo, ya que es confuso. En PowerShell Core 6.1.3 para Linux, ni curl ni wget son los alias. Se refieren al rizo y al wget originales (si están presentes en el sistema). Como son diferentes, el uso de esos alias es una fuente potencial de confusión y scripts no multiplataforma.
v6ak
29

El excelente blog Command Line Kung Fu tiene una publicación donde comparan curl, wget y los comandos relacionados de PowerShell

En una palabra:

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

O, si su versión de Powershell / .Net no acepta 2 parámetros para DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
fuente
Esta respuesta menciona la DownloadFilefunción que también funciona bien.
Paul Hicks
15

También puede instalar Git para Windows y luego poner la carpeta bin Git en su ruta. La instalación de Git incluye, entre otras cosas, curl.exe. Después de la instalación, solo pon %programfiles(x86)%\git\bintu RUTA. Luego podrá usar el comando curl desde el símbolo del sistema de Windows o la consola de PowerShell.

Jamie
fuente
1

Lo más parecido a wgeto curlen Windows son los bits (Servicio de transferencia inteligente en segundo plano), que tiene algunos fragmentos listos para powershell.

akira
fuente
3
Creo que BITS resuelve un problema diferente que wget o curl.
Donald Byrd
¿Recuperando cosas de un servidor HTTP?
akira
2
No :), la inteligencia de fondo es parte de ella.
Donald Byrd
0

rizo

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

potencia 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
Arconte
fuente