PowerShell curl eşdeğeri


146

curlPowerShell'de bir eşdeğeri var mı ? Bazı benzer yeteneklere sahip mi, yoksa 3. taraf cmdlet var mı?



1
Aslında bu soru bana yeterince adil görünüyor? Ancak eski bir cevap var: stackoverflow.com/questions/340553/…
Rup

1
PowerShell'de kıvrılma kullanımı hakkında bu makaleye göz atın: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Yanıtlar:


100

8
Ne yapmaya çalıştığınıza bağlı olarak, bunun yerine Invoke-WebRequest komutunu isteyebilirsiniz.
Timothy Lee Russell,

28
Ayrıca şimdi Powershell olarak curlya da takma adı da verildi wget.
CMCDragonkai

18
Evet, sözdizimi tamamen farklı olduğu için onlara takma ad vermeleri garip. MS bir paket yöneticisini göndermek ve ortak araçların kullanımını kolaylaştırmak istemezse, temel araçların sahte takma adların arkasına saklanması durumu daha iyi hale getirmez.
MichaelGG

1
Invoke-WebRequest ile ilgili en büyük sorun, eğer IE 'başlatılmadı' ise çalışmaz; bu nedenle, boru hattı veya DSC komut dosyaları yazarken, önce bazı ekstra çalışmalar yapmanız gerekir veya Invoke-RestMethod kullanabilirsiniz.
LimpingNinja,

1
@LimpingNinja, bunun için bir kaynağınız var mı? Belki de yaşadığınız sorun bundan kaynaklanıyordu: "-UseBasicParsing Belge Nesne Modeli (DOM) ayrıştırma olmadan HTML içeriği için yanıt nesnesini kullanır. Bu parametre, Internet Explorer'ın Sunucu Çekirdeği yüklemesi gibi bir bilgisayara yüklenmediğinde gereklidir Windows Server işletim sisteminin açıklaması. " dan msdn.microsoft.com/powershell/reference/3.0/...
Michael Kelley

42

Powershell 5.0 itibarıyla, curldaha önce değilse, bunun bir takma adıdır 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

Unaliased komutunu kullanmak için ...

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

Yani isteğin çeşitli özelliklerini aşağıdaki gibi döndür ...

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

... ya da sadece içerik ...

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

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

Eşdeğer takma komutlar ...

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

Powershell varsayılanlarını ve diğer takma adlarını kullanarak komutları kısaltabilirsiniz.

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

... ama bunu tavsiye etmem. Ayrıntılı komutlar, kodunuzu okurken başkalarına yardımcı olur.

Güncelleme:

Powershell 6.x

Takma Ad Kullanımı önerilmez.

İtibariyle PowerShell 6. x "Çekirdek" curl artık için bir takma ad Invoke-WebRequest(diğer adı wgetda kaldırılır). Bunun yerine Invoke-WebRequestdoğrudan kullanın .

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

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

Curl, artık bir RFC'de "takmaların kıvrılması ve Windows PowerShell'den silinmesi için" bir hareketin açıkça görülmesine rağmen ", Invoke-WebRequest (Powershell 6.2.3'te test edilmiştir) için bir diğer ad değildir .

RFC, "wget ​​/ curl takma adlarının zaten PowerShell Core'dan kaldırıldığını, bu nedenle [bu takma adlara sahip olma] sorunu Windows PowerShell ile sınırlandırıldığını" belirtti.

Sonuçta Powershell ekibi, kullanıcıları "komut dosyalarındaki diğer adlara güvenmemeleri" konusunda da teşvik eder.

@ V6ak, PowerShell'i (5.0 veya daha düşük) kullanan curlve kullanan yorumlarda da belirtildiği gibi, wgetbir sorun olabilir: istemeden yan yana kuruluysa gerçek kıvrılmayı veya wget'i çağırmak; ve her durumda karışıklığa neden olur.

Yeni Kodlama

utf8NoBOMKullanırken Invoke-WebRequest(ve diğer birçok metin çıkış komutları) varsayılan kodlamadan yararlanmak için Powershell "core" (6.x veya üstü) yükseltmeniz önerilir . Eğer biri bunu açıkça yapıyorsa, şöyle bir şey yapabilirsiniz:

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 

Ancak, daha kısa, örtük, komut kullanırken bile ...

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

... ile kodlama utf8NoBOMyapılacaktır (örneğin, Visual Studio Kodunda kaydedilmiş dosyayı açıp durum çubuğunda "UTF-8" i izleyerek bunu doğrulayabilirsiniz).

Birlikte kaydedilen dosyalar utf8NoBOM, çeşitli ekosistemler arasında seyahat ederken daha az soruna neden olma eğilimindedir. Elbette, başka bir kodlamaya ihtiyaç duyarsanız, açıkça bazı alternatifler belirleyebilirsiniz.

Powershell 5.0 ve daha düşük sürümlerde utf8NoBOMkodlama kullanılamıyor, varsayılan değer değil.

Detaylar:


-Uri bayrağının ne yaptığı ... 'curl -Uri api.github.com/rate_limit ' için aynı veya onlarla aynı sonuçları alıyorum . Bunu aradım, ama yine de emin değilim
Drenai

1
Powershell'de, bazı parametre isimleri, parametre değerlerinin sıralamasından dolaylı olarak türetilebilir. Bunu bakarak görebilirsiniz get-help curl. Göreceksiniz Invoke-WebRequest [-Uri] <Uri> ..., parantez içinde []belirteçlerin -Uribırakılabildiğini (ve dolayısıyla dolaylı olarak çağrıldığınızı) göreceksiniz . Ana postada bahsettiğim gibi: genel olarak açık olmalısınız (gelecekte sizin veya başkalarının kodunuzu okuyacağı yer).
John Bentley,

Ah teşekkürler. Bu yüzden dışarı gidiyorum, ama yine de çağrılan ediliyor, o da ne bilmiyordum []yaptı
Drenai

Rica ederim. Sende var. Bulduğunuz powershell komutlarının sözdizimi açıklamaları get-help, en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form'un bazı sürümlerinde verilmiştir . Genişletilmiş Backus Naur Formunun bazı sürümlerinin, karşılaşacağınız birçok dilin sözdizimini tanımlamak için kullanıldığı için, okuma / yağmalamayı iyi yapacaksınız. En.wikipedia.org/wiki/… adresinde parantezlerin [ ...]isteğe bağlı bir sözdizimi oluşturduğunu fark edeceksiniz .
John Bentley,

Öyle ama kafa karıştırıcı olduğu için kullanmamayı öneriyorum. Linux için PowerShell Core 6.1.3'te, takma ad veya kıvrılma sözleri değildir. Orijinal kıvrılma ve kalıba atıfta bulunurlar (eğer sistemde mevcutlarsa). Farklı olduklarından, bu takma adların kullanılması olası bir karışıklık kaynağı ve çok platformlu olmayan komut dosyalarıdır.
v6ak

29

Mükemmel Komut Satırı Kung Fu blogu, kıvrım, yazı ve ilgili PowerShell komutlarını karşılaştırdıkları bir gönderiye sahiptir.

Kısaca:

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

Veya, eğer Powershell / .Net versiyonunuz 2 parametre kabul etmiyorsa DownloadString:

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

Bu cevap , DownloadFileiyi çalışan fonksiyondan da bahseder .
Paul Hicks

15

Git for Windows programını yükleyebilir ve ardından Git kutusu klasörünü yolunuza koyabilirsiniz. Git kurulumu, diğerlerinin yanı sıra curl.exe dosyasını da içerir. Kurduktan sonra %programfiles(x86)%\git\binPATH'inizi girin. Daha sonra Windows Komut İstemi veya PowerShell konsolundan curl komutunu kullanabileceksiniz.



1

en yakın şey wgetveya curlpencerelerin üzerinde bit powershell hazır bazı pasajları vardır (Arka Plan Akıllı Aktarım Hizmeti).


3
Ben BITS'nin wget veya curl'den farklı bir problem çözdüğünü düşünüyorum.
Donald Byrd

Bir Http-Sunucusundan bir şey almak?
akira

2
Hayır :), bunun arka plan zeka kısmı.
Donald Byrd


0

bukle

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

güç kalkanı

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.