Setara dengan PowerShell dari curl

146

Apakah ada yang setara dengan curldi PowerShell? Apakah ia memiliki kemampuan bawaan yang serupa atau ada cmdlet pihak ke-3?

Borek Bernard
sumber
5
Tutup? Bagaimana dengan menutup superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… dan banyak lainnya?
Borek Bernard
1
Sebenarnya pertanyaan ini terlihat cukup adil bagi saya? Tapi ada jawaban lama: stackoverflow.com/questions/340553/…
Rup
1
Check out artikel ini tentang menggunakan curl di PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Jawaban:

100

PowerShell 3.0 memiliki perintah baru Invoke-RestMethod:

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

lebih detail:

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

Michael Kelley
sumber
8
Anda mungkin menginginkan perintah Invoke-WebRequest, tergantung pada apa yang ingin Anda capai.
Timothy Lee Russell
28
Itu juga alias curlatau wgetdi Powershell sekarang.
CMCDragonkai
18
Ya itu aneh bahwa mereka akan alias mereka, karena sintaksnya sama sekali berbeda. Jika MS tidak ingin mengirim manajer paket dan membuatnya mudah untuk mendapatkan alat dasar yang umum, menyembunyikannya di balik alias palsu tidak akan membuat situasi lebih baik.
MichaelGG
1
Masalah terbesar dengan Invoke-WebRequest adalah tidak berfungsi jika IE tidak 'diinisialisasi'; jadi saat menulis skrip pipeline atau DSC Anda harus melakukan kerja keras tambahan terlebih dahulu atau Anda dapat menggunakan Invoke-RestMethod.
LimpingNinja
1
@ LimpingNinja, apakah Anda memiliki sumber untuk ini? Mungkin masalah yang Anda alami adalah karena ini: "-UseBasicParsing Menggunakan objek respons untuk konten HTML tanpa parsing Document Object Model (DOM). Parameter ini diperlukan ketika Internet Explorer tidak diinstal pada komputer, seperti pada instalasi Server Core dari sistem operasi Windows Server. " dari msdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley
42

Pada Powershell 5.0, jika tidak sebelumnya, curladalah alias untuk 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

Untuk menggunakan perintah yang tidak dihapus ...

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

Jadi kembalikan beberapa properti dari permintaan sebagai berikut ...

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

... atau hanya isinya ...

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

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

Perintah alias yang setara adalah ...

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

Memanfaatkan default Powershell dan alias lain yang bisa Anda persingkat menjadi perintah

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

... tapi saya tidak akan merekomendasikannya. Perintah Verbose membantu orang lain saat membaca kode Anda.

Memperbarui:

Powershell 6.x

Penggunaan Alias ​​tidak disarankan

Pada Powershell 6.x "Core" curl tidak lagi alias untuk Invoke-WebRequest(alias wgetjuga dihapus). Sebaliknya gunakan Invoke-WebRequestlangsung.

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

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

Curl tidak lagi merupakan alias untuk Invoke-WebRequest (diuji pada Powershell 6.2.3), meskipun ada penolakan nyata terhadap suatu gerakan dalam RFC "untuk menghapus alias curl dan wget dari Windows PowerShell" .

RFC itu mencatat "Alias ​​wget / curl sudah dihapus dari PowerShell Core sehingga masalah [memiliki alias itu] terbatas pada Windows PowerShell."

Sebagai kesimpulan, tim Powershell juga mendorong pengguna "untuk tidak bergantung pada alias dalam skrip".

Seperti @ v6ak telah catat dalam komentar menggunakan curldan wgetdi PowerShell (5.0 atau lebih rendah) dapat menjadi masalah di: secara tidak sengaja memanggil ikal asli atau wget jika dipasang berdampingan; dan, bagaimanapun juga, menyebabkan kebingungan.

Pengkodean Baru

Disarankan Anda memutakhirkan Powershell "inti" (6.x atau lebih tinggi) agar dapat memanfaatkan pengodean default utf8NoBOM, saat menggunakan Invoke-WebRequest(dan banyak perintah keluaran teks lainnya). Jika seseorang melakukan ini secara eksplisit, Anda dapat melakukan sesuatu seperti:

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 

Namun, bahkan ketika menggunakan perintah yang lebih pendek, implisit, ...

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

... penyandian dengan utf8NoBOMakan dilakukan (Anda dapat memverifikasi ini, misalnya, dengan membuka file yang disimpan dalam Visual Studio Code dan mengamati "UTF-8" di bilah status).

File yang disimpan dengan utf8NoBOMcenderung menyebabkan lebih sedikit masalah saat bepergian melalui berbagai ekosistem. Tentu saja, jika Anda memerlukan penyandian lain, Anda dapat menetapkan beberapa alternatif secara eksplisit.

Di Powershell 5.0 dan lebih rendah utf8NoBOMpenyandian tidak tersedia, apalagi default.

Detail:

John Bentley
sumber
Apa yang dilakukan flag -Uri ... Saya mendapatkan hasil yang sama dengan atau tanpa itu untuk 'curl -Uri api.github.com/rate_limit '. Saya sudah mencari ini, tetapi masih belum yakin
Drenai
1
Dalam PowerShell, beberapa nama parameter dapat secara implisit diturunkan dari urutan nilai parameter. Anda dapat melihat ini melalui melihat get-help curl. Anda akan melihat Invoke-WebRequest [-Uri] <Uri> ..., dengan kurung []menunjukkan -Uribisa ditinggalkan (dan karena itu secara implisit dipanggil). Seperti yang saya sebutkan di posting utama: secara umum Anda harus eksplisit (di mana Anda atau orang lain akan membaca kode Anda di masa depan).
John Bentley
Ah - terima kasih. Jadi saya meninggalkannya, tetapi masih digunakan, tidak tahu apa yang []terjadi
Drenai
Sama sama. Anda sudah mendapatkannya. Deskripsi sintaks untuk perintah powershell yang Anda temukan get-helpdiberikan dalam beberapa versi en.wikipedia.org/wiki/Extended_Backus%E2%808093Naur_form . Anda sebaiknya membaca / membaca skim itu karena beberapa versi Formulir Extended Backus Naur kemungkinan digunakan untuk menggambarkan sintaks banyak bahasa yang akan Anda temui. Anda akan melihat bahwa di en.wikipedia.org/wiki/... tanda kurung [ ...]menetapkan sintaks yang opsional.
John Bentley
Memang, tapi saya sarankan tidak menggunakannya, karena membingungkan. Pada PowerShell Core 6.1.3 untuk Linux, baik curl maupun wget adalah alias. Mereka merujuk ke ikal dan wget asli (jika mereka ada dalam sistem). Karena mereka berbeda, penggunaan alias itu adalah sumber potensial kebingungan dan skrip non-multiplatform.
v6ak
29

Blog Kung Fu Baris Perintah yang sangat baik memiliki pos tempat mereka membandingkan ikal, wget, dan perintah PowerShell terkait

Pendeknya:

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

Atau, jika versi Powershell / .Net Anda tidak menerima 2 parameter untuk DownloadString:

(New-Object System.Net.WebClient).DownloadString("http://www.example.com/hello-world.html") > "C:\hello-world.html"
ipr101
sumber
Jawaban ini menyebutkan DownloadFilefungsi yang juga berfungsi dengan baik.
Paul Hicks
15

Anda juga dapat menginstal Git untuk Windows , dan kemudian meletakkan folder bin Git di jalur Anda. Instal Git termasuk, antara lain, curl.exe. Setelah menginstal, cukup masukkan %programfiles(x86)%\git\binPATH Anda. Kemudian Anda akan dapat menggunakan perintah curl dari Windows Command Prompt atau PowerShell console.

Jamie
sumber
1

hal yang paling dekat dengan wgetatau curldi windows adalah bits (Background Intelligent Transfer Service), yang memiliki beberapa cuplikan siap untuk PowerShell.

akira
sumber
3
Saya pikir BITS memecahkan masalah yang berbeda dari wget atau curl.
Donald Byrd
Mengambil barang dari Http-Server?
akira
2
Tidak :), bagian latar belakang intelijennya.
Donald Byrd
0

ikal

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
Archon
sumber