PowerShell เทียบเท่ากับขด


145

มีcurlPowerShell ที่เทียบเท่าหรือไม่ มันมีความสามารถในตัวที่คล้ายกันหรือมี cmdlet ของบุคคลที่สามหรือไม่


5
ปิด? วิธีปิดการใช้superuser.com/questions/34492/… , superuser.com/questions/295021/… , superuser.com/questions/71446/และโฮสต์ของผู้อื่น
Borek Bernard

1
ที่จริงคำถามนี้ดูยุติธรรมพอสำหรับฉันหรือไม่ แต่มีคำตอบเก่า: stackoverflow.com/questions/340553/...
โฟโต้

1
ลองอ่านบทความนี้เกี่ยวกับการใช้ curl ใน PowerShell: thesociablegeek.com/azure/using-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
คุณอาจต้องการคำสั่ง Invoke-WebRequest แทนขึ้นอยู่กับว่าคุณพยายามทำอะไร
ทิโมธีลีรัสเซล

28
นอกจากนี้ยังมีนามแฝงเป็นcurlหรือwgetใน Powershell ในขณะนี้
CMCDragonkai

18
ใช่มันแปลกประหลาดที่พวกเขาต้องการนามแฝงพวกเขาเนื่องจากไวยากรณ์แตกต่างอย่างสิ้นเชิง ถ้า MS ไม่ต้องการจัดส่งเครื่องมือจัดการแพคเกจและทำให้ง่ายต่อการได้รับเครื่องมือพื้นฐานการซ่อนไว้เบื้องหลังนามแฝงปลอมจะไม่ทำให้สถานการณ์ดีขึ้น
MichaelGG

1
ปัญหาที่ใหญ่ที่สุดของ Invoke-WebRequest ก็คือมันไม่ทำงานหาก IE ไม่ 'เริ่มต้น'; ดังนั้นเมื่อเขียนไปป์ไลน์หรือสคริปต์ DSC คุณต้องทำ legwork พิเศษก่อนหรือคุณสามารถใช้ Invoke-RestMethod
LimpingNinja

1
@LimpingNinja คุณมีแหล่งที่มาสำหรับสิ่งนี้หรือไม่? อาจเป็นปัญหาที่คุณประสบเนื่องจาก: "-UseBasicParsing ใช้วัตถุการตอบสนองสำหรับเนื้อหา HTML ที่ไม่มีการแยกวิเคราะห์ Document Object Model (DOM) พารามิเตอร์นี้จำเป็นเมื่อไม่ได้ติดตั้ง Internet Explorer บนคอมพิวเตอร์เช่นในการติดตั้งเซิร์ฟเวอร์หลัก ของระบบปฏิบัติการ Windows Server " จากmsdn.microsoft.com/powershell/reference/3.0/…
Michael Kelley

42

ในฐานะของ Powershell 5.0 หากไม่ได้ก่อนเป็นนามแฝงสำหรับcurlInvoke-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 ...

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 ...]

คำสั่ง aliased ที่เทียบเท่าคือ ...

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

... แต่ฉันไม่อยากจะแนะนำ คำสั่งอย่างละเอียดช่วยให้ผู้อื่นเมื่ออ่านรหัสของคุณ

ปรับปรุง:

PowerShell 6.x

การใช้นามแฝงไม่สนับสนุน

ในฐานะของPowershell 6.x "Core" curlจะไม่เป็นชื่อแทนอีกต่อไปInvoke-WebRequest( wgetจะลบชื่อแทนออก) ใช้แทนInvoke-WebRequestโดยตรง

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

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

Curl ไม่ได้เป็นนามแฝงสำหรับวิงวอน-WebRequest (การทดสอบเกี่ยวกับ Powershell 6.2.3) แม้จะมีการปฏิเสธชัดเจนของการเคลื่อนไหวในการอื่นRFC "เพื่อที่จะลบชื่อแทนขดและ wget จาก Windows PowerShell"

RFC นั้นตั้งข้อสังเกตว่า "นามแฝง wget / curl ถูกลบออกจาก PowerShell Core แล้วดังนั้นปัญหา [การมีนามแฝงเหล่านั้น] นั้น จำกัด อยู่ที่ Windows PowerShell"

ในบทสรุปทีม Powershell ยังสนับสนุนให้ผู้ใช้ "ไม่พึ่งพานามแฝงในสคริปต์"

ในฐานะที่เป็น @ v6ak ได้ระบุไว้ในความคิดเห็นที่ใช้curlและwgetใน PowerShell (5.0 หรือต่ำกว่า) อาจมีปัญหาใน: การเรียกใช้ขดจริงหรือ wget โดยไม่ตั้งใจถ้าติดตั้งเคียงข้างกัน; และในกรณีใด ๆ ทำให้เกิดความสับสน

ใหม่การเข้ารหัส

ขอแนะนำให้คุณอัพเกรด Powershell "core" (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จะเสร็จสิ้น (คุณสามารถตรวจสอบสิ่งนี้ได้เช่นโดยการเปิดไฟล์ที่บันทึกใน Visual Studio Code และสังเกต "UTF-8" ในแถบสถานะ)

ไฟล์ที่บันทึกด้วยutf8NoBOMมักจะทำให้เกิดปัญหาน้อยลงเมื่อเดินทางผ่านระบบนิเวศต่างๆ แน่นอนถ้าคุณต้องการการเข้ารหัสอื่น ๆ คุณสามารถกำหนดทางเลือกบางอย่างได้อย่างชัดเจน

ใน Powershell 5.0 และต่ำกว่าการutf8NoBOMเข้ารหัสไม่พร้อมใช้งานให้เริ่มต้นโดยลำพัง

รายละเอียด:


การตั้งค่าสถานะ -Uri คืออะไร ... ฉันได้รับผลลัพธ์เดียวกันโดยมีหรือไม่มีสำหรับ 'curl -Uri api.github.com/rate_limit ' ฉันค้นหาสิ่งนี้แล้ว แต่ก็ยังไม่แน่ใจ
เดรนัย

1
ใน powershell ชื่อพารามิเตอร์บางอย่างสามารถได้มาโดยปริยายจากลำดับของค่าพารามิเตอร์ get-help curlคุณสามารถดูนี้ผ่านการมองหาที่ คุณจะเห็นInvoke-WebRequest [-Uri] <Uri> ...ด้วยวงเล็บ[]ที่ระบุ-Uriสามารถด้านซ้ายออก (และดังนั้นจึงเรียกโดยปริยาย) ตามที่ฉันพูดถึงในโพสต์หลัก: โดยทั่วไปคุณควรมีความชัดเจน (ที่คุณหรือคนอื่น ๆ จะอ่านรหัสของคุณในอนาคต)
John Bentley

อ่า - ขอบคุณ ดังนั้นฉันปล่อยให้มันออกมา แต่ก็ยังคงถูกเรียกไม่ทราบว่าเป็นอะไร[]ไม่ได้
Drenai

ยินดี. คุณได้มัน. คำอธิบายไวยากรณ์สำหรับคำสั่ง PowerShell ที่คุณพบในget-helpจะได้รับในรุ่นของบางen.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form คุณควรอ่าน / อ่านอย่างแผ่วเบาเนื่องจากมีบางเวอร์ชันของ Extended Backus Naur Form ที่ใช้ในการอธิบายไวยากรณ์ของหลายภาษาที่คุณเจอ คุณจะสังเกตเห็นว่าที่en.wikipedia.org/wiki/…วงเล็บใหญ่[ ...]กำหนดไวยากรณ์ที่เป็นตัวเลือก
John Bentley

มันเป็น แต่ฉันไม่แนะนำให้ใช้เพราะมันสับสน บน PowerShell Core 6.1.3 สำหรับ Linux ทั้งขดและ wget เป็นนามแฝง พวกเขาอ้างถึง curl ดั้งเดิมและ wget (ถ้าพวกเขาอยู่ในระบบ) เนื่องจากมีความแตกต่างกันการใช้นามแฝงเหล่านี้จึงเป็นแหล่งที่มาของความสับสนและสคริปต์ที่ไม่ใช่แพลตฟอร์มที่หลากหลาย
v6ak

29

บล็อก Command Line Kung Fu ที่ยอดเยี่ยมมีการโพสต์ที่จะเปรียบเทียบ curl, wget และคำสั่ง PowerShell ที่เกี่ยวข้อง

โดยสังเขป:

(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

คุณยังสามารถติดตั้งGit สำหรับ Windowsแล้วใส่โฟลเดอร์ Git bin ลงในพา ธ ของคุณ การติดตั้ง Git นั้นรวมถึง curl.exe หลังจากติดตั้งเพียงแค่ใส่%programfiles(x86)%\git\binPATH ของคุณ จากนั้นคุณจะสามารถใช้คำสั่ง curl จากคอนโซล Windows Command Prompt หรือ PowerShell



1

สิ่งที่ใกล้เคียงที่สุดไปยังwgetหรือcurlบน windows คือบิต (Background Intelligent Transfer Service) ซึ่งมีตัวอย่างบางส่วนที่พร้อมสำหรับ PowerShell


3
ฉันคิดว่า BITS แก้ปัญหาแตกต่างจาก wget หรือ curl
โดนัลด์เบิร์ด

กำลังดึงสิ่งต่าง ๆ จาก Http-Server
akira

2
ไม่ :) ส่วนพื้นหลังของข่าวกรองนั้น
Donald Byrd


0

ขด

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.