PowerShell कर्ल के बराबर


145

क्या curlपॉवरशेल के बराबर है ? क्या इसमें कुछ समान अंतर्निहित क्षमता है या क्या कोई 3 पार्टी का cmdlet है?


5
बन्द है? Superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/… और दूसरों की मेजबानी करने के बारे में कैसे ?
बोरक बर्नार्ड

1
वास्तव में यह प्रश्न मुझे उचित लगता है? लेकिन एक पुराना जवाब है: stackoverflow.com/questions/340553/…
Rup

1
PowerShell में कर्ल का उपयोग करने के बारे में इस लेख को देखें: thesociablegeek.com/azure/use-curl-in-powershell
SDsolar

जवाबों:


100

PowerShell 3.0 में नया कमांड है Invoke-RestMethod:

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

ज्यादा जानकारी:

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


8
आप इनवॉइस-वेबरैक्स्ट कमांड के बजाय यह चाह सकते हैं कि आप जो पूरा करने की कोशिश कर रहे हैं उसके आधार पर।
टिमोथी ली रसेल

28
यह भी अब के रूप में curlया wgetPowershell में aliased है ।
CMCDragonkai

18
हाँ, यह विचित्र है कि वे उन्हें अलग कर देंगे, क्योंकि वाक्य रचना पूरी तरह से अलग है। यदि एमएस एक पैकेज मैनेजर को शिप नहीं करना चाहता है और सामान्य, बुनियादी उपकरण प्राप्त करना आसान बनाता है, तो नकली उपनाम के पीछे छिपाना स्थिति को बेहतर बनाने वाला नहीं है।
माइकलजीजी

1
Invoke-WebRequest के साथ सबसे बड़ी समस्या यह है कि यह काम नहीं करता है यदि IE 'आरंभीकृत' नहीं है; इसलिए पाइपलाइन या डीएससी स्क्रिप्ट लिखते समय आपको पहले कुछ अतिरिक्त कार्य करना होता है या आप इनवोक-रेस्टमैथोड का उपयोग कर सकते हैं।
लिम्पिंगनिंजा

1
@LimpingNinja, क्या आपके पास इसके लिए एक स्रोत है? हो सकता है कि आपके द्वारा अनुभव की गई समस्या इसके कारण थी: "-UseBasicParsing HTML ऑब्जेक्ट के लिए ऑब्जेक्ट ऑब्जेक्ट को डॉक्यूमेंट ऑब्जेक्ट मॉडल (DOM) पार्सिंग के बिना उपयोग करता है। यह पैरामीटर आवश्यक है जब इंटरनेट एक्सप्लोरर कंप्यूटर पर स्थापित नहीं होता है, जैसे कि सर्वर कोर इंस्टॉलेशन। एक विंडोज सर्वर ऑपरेटिंग सिस्टम का। " msdn.microsoft.com/powershell/reference/3.0/… से
माइकल केली

42

Powershell 5.0 के रूप में, यदि पहले नहीं, तो इसके curlलिए एक अन्य नाम है 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

अप्रयुक्त आदेश का उपयोग करने के लिए ...

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

इसलिए अनुरोध के कई गुणों को निम्नानुसार लौटाएं ...

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

... या सिर्फ सामग्री ...

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

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

समान उपनाम वाले आदेश हैं ...

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

Powershell चूक और अन्य उपनामों का उत्तोलन आप कमांड को छोटा कर सकते हैं

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

... लेकिन मैं इसकी सिफारिश नहीं करूंगा। वर्बोज़ कमांड्स आपके कोड को पढ़ते समय दूसरों की मदद करते हैं।

अपडेट करें:

पॉवरशेल 6.x

उपनामों का उपयोग हतोत्साहित किया

के रूप में Powershell 6.x "कोर" curl नहीं रह गया है के लिए एक उपनाम है Invoke-WebRequest(उर्फ wgetभी निकाल दिया जाता है)। इसके बजाय Invoke-WebRequestसीधे उपयोग करें।

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

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

कर्ल अब Invoke-WebRequest (Powershell 6.2.3 पर परीक्षण किया गया) के लिए एक उपनाम नहीं है, एक RFC में प्रस्ताव की स्पष्ट अस्वीकृति के बावजूद "एलियास कर्ल को हटाने और विंडोज पॉवरशेल से छूट के लिए"

यह RFC नोट करता है "Wget / कर्ल उपनामों को पहले से ही PowerShell Core से हटा दिया गया था, इसलिए समस्या [उन उपनामों के होने] Windows PowerShell तक सीमित थी।"

निष्कर्ष में पॉवर्सशेल टीम उपयोगकर्ताओं को "लिपियों में उपनामों पर भरोसा न करने" के लिए भी प्रोत्साहित करती है।

जैसा कि @ v6ak ने टिप्पणियों का उपयोग करते हुए curlऔर पावरशेल में wget(5.0 या उससे कम) नोट किया है: इसमें अनजाने में वास्तविक कर्ल लगाना या डगमगाना अगर साइड-बाय-साइड स्थापित है; और, किसी भी मामले में, भ्रम का कारण बनता है।

नया एन्कोडिंग

यह अनुशंसा की जाती है कि आप डिफ़ॉल्ट एन्कोडिंग का लाभ लेने के लिए पॉवर्सशैल "कोर" (6.x या इसके बाद के संस्करण) को अपग्रेड करें utf8NoBOM, जब Invoke-WebRequest(और कई अन्य टेक्स्ट आउटपुट कमांड का उपयोग करते हुए )। यदि कोई ऐसा स्पष्ट रूप से कर रहा था तो आप कुछ ऐसा कर सकते थे:

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 

हालांकि, यहां तक ​​कि जब एक छोटी, अंतर्निहित, आदेश का उपयोग कर ...

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

... के साथ एन्कोडिंग की utf8NoBOMजाएगी (आप इसे सत्यापित कर सकते हैं, उदाहरण के लिए, विजुअल स्टूडियो कोड में सहेजी गई फ़ाइल को खोलकर और स्टेटस बार में "UTF-8" देख सकते हैं)।

utf8NoBOMविभिन्न पारिस्थितिकी प्रणालियों के माध्यम से यात्रा करते समय कम समस्याओं का कारण बनने वाली फाइलों को बचाया जाता है । बेशक, अगर आपको कुछ अन्य एन्कोडिंग की आवश्यकता है तो आप स्पष्ट रूप से कुछ विकल्प निर्धारित कर सकते हैं।

Powershell 5.0 में और निम्न utf8NoBOMएन्कोडिंग उपलब्ध नहीं थी, अकेले डिफ़ॉल्ट को छोड़ दें।

विवरण:


क्या कर रहा है -Uri झंडा कर रहा है ... मैं 'कर्ल -Uri api.github.com/rate_limit ' के लिए या इसके बिना एक ही परिणाम प्राप्त करता हूं । मैंने इसके लिए खोज की है, लेकिन अभी भी निश्चित नहीं है
Drenai

1
पावरशेल में कुछ पैरामीटर नाम पैरामीटर मानों के क्रम से निकाले जा सकते हैं। आप इसे देखकर देख सकते हैं get-help curl। आप देखेंगे Invoke-WebRequest [-Uri] <Uri> ..., []संकेत देने वाले कोष्ठकों के साथ -Uriछोड़ दिया जा सकता है (और इसलिए संक्षेप में आह्वान किया गया है)। जैसा कि मैंने मुख्य पोस्ट में उल्लेख किया है: सामान्य तौर पर आपको स्पष्ट होना चाहिए (जहां आप या अन्य भविष्य में अपना कोड पढ़ने जा रहे हैं)।
जॉन बेंटले

आह - धन्यवाद। इसलिए मैं इसे छोड़ रहा हूं, लेकिन यह अभी भी आह्वान किया जा रहा है, पता नहीं है कि क्या []किया है
Drenai

आपका स्वागत है। तुम्हें यह मिल गया है। शक्तियां आदेशों के लिए वाक्यविन्यास विवरण जो आप पाते हैं get-help, en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form के कुछ संस्करण में दिए गए हैं । आप पढ़ने / स्किम करने के लिए अच्छी तरह से करेंगे क्योंकि विस्तारित बैकस नौर फॉर्म के कुछ संस्करण का उपयोग संभवतः कई भाषाओं के वाक्यविन्यास का वर्णन करने के लिए किया जाता है जो हम आर-पार हैं। आप देखेंगे कि en.wikipedia.org/wiki/… कोष्ठक [ ...]सिंटैक्स को वैकल्पिक बनाते हैं।
जॉन बेंटले

यह है, लेकिन मेरा सुझाव है कि इसका उपयोग न करें, क्योंकि यह भ्रामक है। लिनक्स के लिए पॉवरशेल कोर 6.1.3 पर, न तो कर्ल और न ही अलिज़ हैं। वे मूल कर्ल और विग का उल्लेख करते हैं (यदि वे सिस्टम में मौजूद हैं)। चूंकि वे अलग-अलग हैं, इसलिए उन उपनामों का उपयोग भ्रम और गैर-मल्टीप्लायर स्क्रिप्ट्स का एक संभावित स्रोत है।
v6ak

29

उत्कृष्ट कमांड लाइन कुंग फू ब्लॉग में एक पोस्ट है जहां वे कर्ल, विग और संबंधित पॉवरशेल कमांड की तुलना करते हैं

संक्षेप में:

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

या, यदि आपके Powershell / .net का संस्करण 2 मापदंडों को स्वीकार नहीं करता है DownloadString:

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

इस उत्तर में उस DownloadFileफ़ंक्शन का उल्लेख है जो अच्छी तरह से काम करता है।
पॉल हिक्स

15

आप Windows के लिए Git भी स्थापित कर सकते हैं , और फिर अपने रास्ते में Git बिन फ़ोल्डर डाल सकते हैं। Git इंस्टॉल में अन्य चीजों के अलावा, curl.exe शामिल है। स्थापित करने के बाद, बस %programfiles(x86)%\git\binअपने पेट में डाल दिया । तब आप Windows कमांड प्रॉम्प्ट या PowerShell कंसोल से कर्ल कमांड का उपयोग कर पाएंगे।



1

wgetया curlविंडोज़ पर सबसे पास की चीज़ बिट्स (बैकग्राउंड इंटेलिजेंट ट्रांसफर सर्विस) है, जिसमें कुछ स्निपेट्स हैं जो पावरशेल के लिए तैयार हैं।


3
मुझे लगता है कि BITS को wget या कर्ल की तुलना में एक अलग समस्या का हल मिलता है।
डोनाल्ड बर्ड

Http- सर्वर से चीज़ें लाना?
अकीरा

2
नहीं :), यह की पृष्ठभूमि खुफिया हिस्सा है।
डोनाल्ड बर्ड


0

कर्ल

सीएमडी, बैश

curl -H "Host: whoami.local" 192.168.4.4

शक्ति कोशिका

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.