PowerShell equivalente a ondulação

146

Existe um equivalente curlno PowerShell? Possui algum recurso interno semelhante ou existe um cmdlet de terceiros?

Borek Bernard
fonte
5
Fechadas? Que tal fechar superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… e muitos outros?
Borek Bernard 10/10
11
Na verdade, esta pergunta parece justa o suficiente para mim? Mas há uma resposta de idade: stackoverflow.com/questions/340553/...
Rup
11
Confira este artigo sobre o uso de onda em PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Respostas:

100

O PowerShell 3.0 tem o novo comando Invoke-RestMethod:

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

Mais detalhes:

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

Michael Kelley
fonte
8
Você pode querer o comando Invoke-WebRequest, dependendo do que você está tentando realizar.
Timothy Lee Russell
28
Também está aliasado como curlou wgetno PowerShell agora.
CMCDragonkai
18
Sim, é bizarro que eles os apelidassem, pois a sintaxe é totalmente diferente. Se a MS não quiser enviar um gerenciador de pacotes e facilitar o acesso a ferramentas básicas comuns, escondê-lo atrás de um apelido falso não vai melhorar a situação.
precisa
11
O maior problema com o Invoke-WebRequest é que ele não funciona se o IE não for 'inicializado'; portanto, ao escrever scripts de pipeline ou DSC, primeiro você deve fazer algum trabalho extra ou usar Invoke-RestMethod.
LimpingNinja
11
@LimpingNinja, você tem uma fonte para isso? Talvez o problema que você teve foi devido a isso: "-UseBasicParsing Usa o objeto de resposta para o conteúdo HTML sem a análise do DOM (Document Object Model). Esse parâmetro é necessário quando o Internet Explorer não está instalado nos computadores, como em uma instalação Server Core de um sistema operacional Windows Server ". de msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

A partir do Powershell 5.0, se não antes, curlé um 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 o comando sem serrilhado ...

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

Portanto, retorne várias propriedades da solicitação da seguinte maneira ...

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 apenas o conteúdo ...

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

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

Os comandos com alias equivalentes são ...

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

Aproveitando os padrões do Powershell e outros aliases, você pode reduzir os comandos para

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

... mas eu não recomendaria. Os comandos detalhados ajudam outras pessoas ao ler seu código.

Atualizar:

Powershell 6.x

Uso de aliases desencorajado

A partir do Powershell 6.x, "Core" curl não é mais um alias para Invoke-WebRequest(o alias wgettambém é removido). Em vez disso, use Invoke-WebRequestdiretamente.

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

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

A ondulação não é mais um alias para Invoke-WebRequest (testado no Powershell 6.2.3), apesar de uma aparente rejeição de um movimento em uma RFC "para remover os aliases ondulados e wget do Windows PowerShell" .

Que a RFC observa "Os aliases wget / curl já foram removidos do PowerShell Core, portanto o problema [de ter esses aliases] foi limitado ao Windows PowerShell".

Na conclusão, a equipe do Powershell também incentiva os usuários "a não confiarem em aliases nos scripts".

Como o @ v6ak observou nos comentários, o uso curle wgetno PowerShell (5.0 ou inferior) pode ser um problema: involuntariamente involuntariamente o real curl ou wget, se instalado lado a lado; e, em qualquer caso, causa confusão.

Nova codificação

Recomenda-se atualizar o "core" do Powershell (6.x ou superior) para aproveitar a codificação padrão utf8NoBOMao usar Invoke-WebRequest(e muitos outros comandos de saída de texto). Se alguém estivesse fazendo isso explicitamente, você poderia fazer 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 

No entanto, mesmo ao usar um comando mais curto, implícito, ...

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

... a codificação utf8NoBOMserá feita (você pode verificar isso, por exemplo, abrindo o arquivo salvo no Visual Studio Code e observando "UTF-8" na barra de status).

Os arquivos salvos utf8NoBOMtendem a causar menos problemas ao viajar por vários ecossistemas. Obviamente, se você precisar de outra codificação, poderá definir algumas alternativas explicitamente.

No Powershell 5.0 e inferior, a utf8NoBOMcodificação não estava disponível, muito menos o padrão.

Detalhes:

John Bentley
fonte
O que a bandeira -Uri está fazendo ... Eu obtenho os mesmos resultados com ou sem ela para 'curl -Uri api.github.com/rate_limit '. Eu procurei por isso, mas ainda não tenho certeza
Drenai
11
No PowerShell, alguns nomes de parâmetros podem ser implicitamente derivados da ordem dos valores dos parâmetros. Você pode ver isso olhando get-help curl. Você verá que Invoke-WebRequest [-Uri] <Uri> ..., com os colchetes, a []indicação -Uripode ser deixada de fora (e, portanto, implicitamente invocada). Como mencionei no post principal: em geral, você deve ser explícito (onde você ou outras pessoas vão ler seu código no futuro).
31417 John Bentley
Ah - obrigada. Então, eu estou deixando-o para fora, mas ele ainda está sendo invocado, não sabia que o que o []fez
Drenai
Você é bem vindo. Você conseguiu. As descrições de sintaxe para os comandos do powershell que você encontra get-helpsão fornecidas em algumas versões do en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Você fará bem em ler / ler isso porque, provavelmente, uma versão do Extended Backus Naur Form é usada para descrever a sintaxe de muitos idiomas que você encontrará. Você notará que, em en.wikipedia.org/wiki/…, colchetes [ ...]designam sintaxe opcional.
John John Bentley
É, mas sugiro não usá-lo, pois é confuso. No PowerShell Core 6.1.3 para Linux, nem curl nem wget são os aliases. Eles se referem à curvatura e ao wget originais (se estiverem presentes no sistema). Como são diferentes, o uso desses aliases é uma fonte potencial de confusão e scripts não multiplataforma.
v6ak 7/03
29

O excelente blog Kung Fu da linha de comando tem uma postagem na qual eles comparam curl, wget e os comandos relacionados do PowerShell

Em poucas palavras:

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

Ou, se sua versão do Powershell / .Net não aceitar 2 parâmetros para DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
fonte
Esta resposta menciona a DownloadFilefunção que também funciona bem.
Paul Hicks
15

Você também pode instalar o Git for Windows e, em seguida, colocar a pasta bin Git no seu caminho. A instalação do Git inclui, entre outras coisas, curl.exe. Após a instalação, basta colocar %programfiles(x86)%\git\binno seu PATH. Em seguida, você poderá usar o comando curl no prompt de comando do Windows ou no console do PowerShell.

Jamie
fonte
1

o mais próximo wgetou curlno Windows são os bits (Serviço de transferência inteligente em segundo plano), que possui alguns trechos prontos para o PowerShell.

akira
fonte
3
Acho que o BITS resolve um problema diferente do que o wget ou curl.
Donald Byrd
Buscando coisas de um servidor HTTP?
akira
2
Não :), a parte de inteligência de fundo disso.
Donald Byrd
0

ondulação

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
Arconte
fonte