PowerShell equivalente a curl
¿Hay un equivalente a curl
en PowerShell? ¿Tiene alguna capacidad incorporada similar o hay un cmdlet de terceros?
¿Hay un equivalente a curl
en PowerShell? ¿Tiene alguna capacidad incorporada similar o hay un cmdlet de terceros?
PowerShell 3.0 tiene el nuevo comando Invoke-RestMethod
:
http://technet.microsoft.com/en-us/library/hh849971.aspx
más detalles: https://discoposse.com/2012/06/30/powershell-invoke-restmethod-putting-the-curl-in-your-shell/
A partir de Powershell 5.0, si no antes, curl
es un alias de 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 unaliased …
PS> Invoke-WebRequest -Uri https://localhost:443/
PS> Invoke-WebRequest -Uri https://www.google.com
Así que devuelve varias propiedades de la solicitud como sigue …
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 sólo 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
Apalancamiento de los valores por defecto de Powershell y otros alias que podría acortar los comandos a
PS> curl https://www.google.com
ps> curl https://www.google.com | Select -ExpandProperty Content
… pero yo no lo recomendaría. Los comandos de Verbose ayudan a otros cuando leen su código.
Actualización:
A partir de Powershell 6.x “Core” curl
ya no es un alias para Invoke-WebRequest
(el alias wget
también se elimina) . En su lugar, use Invoke-WebRequest
directamente.
PS> Get-Alias -Definition Invoke-WebRequest | Format-Table -AutoSize
CommandType Name Version Source
----------- ---- ------- ------
Alias iwr -> Invoke-WebRequest
Curl ya no es un alias de Invoke-WebRequest (probado en Powershell 6.2.3), a pesar del 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 fueron removidos del núcleo de PowerShell por lo que el problema [de tener esos alias] se limitó a Windows PowerShell”
En la conclusión el equipo de Powershell también alienta a los usuarios “a no confiar en los alias en los scripts”.
Como @v6ak ha señalado en los comentarios, el uso de curl
y wget
en PowerShell (5.0 o inferior) puede ser un problema en: invocar involuntariamente el rizo real o wget si se instalan uno al lado del otro; y, en cualquier caso, causa confusión.
Se recomienda actualizar el “núcleo” de Powershell (6.x o superior) para aprovechar la codificación por defecto utf8NoBOM
, al usar Invoke-WebRequest
(y muchos otros comandos de salida de texto). Si se hiciera esto explícitamente se 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 hará la codificación con utf8NoBOM
(se 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 con utf8NoBOM
tienden a causar menos problemas cuando se viaja a través de varios ecosistemas. Por supuesto, si necesitas alguna otra codificación puedes establecer alguna alternativa explícitamente.
En Powershell 5.0 y inferior la codificación de utf8NoBOM
no estaba disponible, y mucho menos la predeterminada.
Detalles:
El excelente blog de Kung Fu de Línea de Comando tiene un post donde comparan curl, wget y los comandos relacionados de PowerShell
En resumen:
(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"
También puedes instalar Git para Windows , y luego poner la carpeta bin de Git en tu ruta. La instalación de Git incluye, entre otras cosas, curl.exe. Después de la instalación, simplemente pon %programfiles(x86)%\git\bin
en tu PATH. A continuación, podrás usar el comando curl desde el Símbolo del sistema de comandos de Windows o desde la consola de PowerShell.
Puedes instalar curl con Chocolatey y tener el curl disponible en PowerShell CLI o cmd
.
Este comando debería funcionar:
Invoke-WebRequest -UseBasicParsing -Uri http://example.com/
Es parte de Microsoft.PowerShell.Utility desde PowerShell 3.0.
Ver también: Obtener $webclient.downloadstring para escribir en un archivo de texto en Powershell .