PowerShell equivalente a ondulação


146

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



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

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:


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"

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.



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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.