Equivalente di PowerShell al ricciolo


146

Esiste un equivalente di curlin PowerShell? Dispone di funzionalità incorporate simili o esiste un cmdlet di terze parti?



1
In realtà questa domanda mi sembra abbastanza giusta? Ma c'è una vecchia risposta: stackoverflow.com/questions/340553/…
Rup

Risposte:


100

8
È possibile che si desideri invece il comando Invoke-WebRequest, a seconda di ciò che si sta tentando di realizzare.
Timothy Lee Russell,

28
È anche alias come curlo wgetin Powershell ora.
CMCDragonkai,

18
Sì, è bizzarro che li abbiano alias, poiché la sintassi è completamente diversa. Se MS non vuole spedire un gestore di pacchetti e rendere facile ottenere strumenti di base comuni, nasconderlo dietro un falso alias non migliorerà la situazione.
MichaelGG

1
Il problema più grande con Invoke-WebRequest è che non funziona se IE non è "inizializzato"; quindi quando si scrivono pipeline o script DSC è necessario prima fare qualche lavoro extra o usare Invoke-RestMethod.
LimpingNinja,

1
@LimpingNinja, hai una fonte per questo? Forse il problema riscontrato è dovuto a questo: "-UseBasicParsing Utilizza l'oggetto di risposta per il contenuto HTML senza analisi DOM (Document Object Model). Questo parametro è richiesto quando Internet Explorer non è installato nei computer, ad esempio in un'installazione Server Core di un sistema operativo Windows Server. " da msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley,

42

A partire da Powershell 5.0, se non prima, curlè un alias per 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

Per utilizzare il comando non polarizzato ...

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

Quindi restituisci diverse proprietà della richiesta come segue ...

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 il contenuto ...

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

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

I comandi con alias equivalenti sono ...

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

Sfruttando le impostazioni predefinite di Powershell e altri alias a cui potresti abbreviare i comandi

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

... ma non lo consiglierei. I comandi dettagliati aiutano gli altri nella lettura del codice.

Aggiornare:

Powershell 6.x

L'uso degli alias è scoraggiato

A partire da Powershell 6.x "Core" curl non è più un alias per Invoke-WebRequest( wgetviene rimosso anche l'alias ). Invece usa Invoke-WebRequestdirettamente.

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

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

Curl non è più un alias per Invoke-WebRequest (testato su Powershell 6.2.3), nonostante un evidente rifiuto di un movimento in un RFC "per rimuovere gli alias curl e wget da Windows PowerShell" .

Che RFC nota "Gli alias wget / curl erano già stati rimossi da PowerShell Core, quindi il problema [di avere quegli alias] era limitato a Windows PowerShell".

In conclusione, il team di Powershell incoraggia inoltre gli utenti a "non fare affidamento sugli alias negli script".

Come ha notato @ v6ak nei commenti, usare curle wgetin PowerShell (5.0 o precedente) può essere un problema: invocare involontariamente il ricciolo reale o wget se installato fianco a fianco; e, in ogni caso, causa confusione.

Nuova codifica

Si consiglia di aggiornare Powershell "core" (6.xo versioni successive) al fine di sfruttare la codifica predefinita utf8NoBOM, quando si utilizza Invoke-WebRequest(e molti altri comandi di output di testo). Se uno lo facesse esplicitamente, potresti fare qualcosa del tipo:

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 

Tuttavia, anche quando si utilizza un comando più breve, implicito, ...

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

... utf8NoBOMverrà eseguita la codifica con (è possibile verificarlo, ad esempio, aprendo il file salvato in Visual Studio Code e osservando "UTF-8" nella barra di stato).

I file salvati con utf8NoBOMtendono a causare meno problemi quando viaggiano attraverso vari ecosistemi. Naturalmente, se hai bisogno di un'altra codifica, puoi impostare esplicitamente un'alternativa.

In Powershell 5.0 e versioni precedenti la utf8NoBOMcodifica non era disponibile, per non parlare del valore predefinito.

Dettagli:


Che cosa sta facendo la bandiera -Uri ... Ottengo gli stessi risultati con o senza "curl -Uri api.github.com/rate_limit ". Ho cercato questo, ma non ne sono ancora sicuro
Drenai,

1
In PowerShell alcuni nomi di parametri possono essere implicitamente derivati ​​dall'ordine dei valori dei parametri. Puoi vederlo guardando get-help curl. Vedrai Invoke-WebRequest [-Uri] <Uri> ..., con le parentesi che []indicano -Uripossono essere esclusi (e quindi implicitamente richiamati). Come ho detto nel post principale: in generale dovresti essere esplicito (dove tu o altri leggerete il vostro codice in futuro).
John Bentley,

Ah - grazie. Quindi lo sto tralasciando, ma è ancora invocato, non sapevo che fosse quello che ha []fatto
Drenai,

Prego. Ce l'hai Le descrizioni della sintassi per i comandi PowerShell che trovi in get-helpsono fornite in alcune versioni di en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form . Farai bene a leggerlo / scremarlo perché una versione di Extended Backus Naur Form è probabilmente usata per descrivere la sintassi di molte lingue che incontrerai. Noterai che su en.wikipedia.org/wiki/… le parentesi [ ...]designano la sintassi opzionale.
John Bentley,

Lo è, ma suggerisco di non usarlo, poiché è confuso. Su PowerShell Core 6.1.3 per Linux, né curl né wget sono gli alias. Si riferiscono all'arricciatura originale e al wget (se presenti nel sistema). Poiché sono diversi, l'uso di questi alias è una potenziale fonte di confusione e script non multipiattaforma.
v6ak

29

L'eccellente blog Command Line Kung Fu ha un post in cui si confrontano curl, wget e i relativi comandi di PowerShell

In breve:

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

Oppure, se la tua versione di Powershell / .Net non accetta 2 parametri per DownloadString:

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

Questa risposta menziona la DownloadFilefunzione che funziona anche bene.
Paul Hicks,

15

Puoi anche installare Git per Windows , quindi inserire la cartella del cestino Git nel tuo percorso. L'installazione di Git include, tra le altre cose, curl.exe. Dopo l'installazione, inserisci semplicemente %programfiles(x86)%\git\binil PERCORSO. Quindi sarai in grado di usare il comando curl dal prompt dei comandi di Windows o dalla console di PowerShell.



1

la cosa più vicina a wgeto curlsu Windows sono i bit (Background Intelligent Transfer Service), che ha alcuni frammenti pronti per PowerShell.


3
Penso che BITS risolva un problema diverso rispetto a wget o curl.
Donald Byrd,

Recuperare cose da un server HTTP?
Akira,

2
No :), la parte dell'intelligenza di fondo.
Donald Byrd,


0

arricciare

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.