Esiste un equivalente di curl
in PowerShell? Dispone di funzionalità incorporate simili o esiste un cmdlet di terze parti?
Esiste un equivalente di curl
in PowerShell? Dispone di funzionalità incorporate simili o esiste un cmdlet di terze parti?
Risposte:
PowerShell 3.0 ha il nuovo comando Invoke-RestMethod
:
http://technet.microsoft.com/en-us/library/hh849971.aspx
più dettaglio:
https://discoposse.com/2012/06/30/powershell-invoke-restmethod-putting-the-curl-in-your-shell/
curl
o wget
in Powershell ora.
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:
A partire da Powershell 6.x "Core" curl
non è più un alias per Invoke-WebRequest
( wget
viene rimosso anche l'alias ). Invece usa Invoke-WebRequest
direttamente.
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 curl
e wget
in 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.
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
... utf8NoBOM
verrà 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 utf8NoBOM
tendono 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 utf8NoBOM
codifica non era disponibile, per non parlare del valore predefinito.
Dettagli:
get-help curl
. Vedrai Invoke-WebRequest [-Uri] <Uri> ...
, con le parentesi che []
indicano -Uri
possono 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).
[]
fatto
get-help
sono 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.
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"
DownloadFile
funzione che funziona anche bene.
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\bin
il PERCORSO. Quindi sarai in grado di usare il comando curl dal prompt dei comandi di Windows o dalla console di PowerShell.
Puoi installare cURL con Chocolatey e avere l'arricciatura disponibile nell'interfaccia della riga di comando di PowerShell o cmd
.
la cosa più vicina a wget
o curl
su Windows sono i bit (Background Intelligent Transfer Service), che ha alcuni frammenti pronti per PowerShell.
Questo comando dovrebbe funzionare:
Invoke-WebRequest -UseBasicParsing -Uri http://example.com/
Fa parte di Microsoft.PowerShell.Utility da PowerShell 3.0.
Vedi anche: Ottieni $ webclient.downloadstring per scrivere su file di testo in Powershell .