PowerShell tương đương với curl


146

Có tương đương với curlPowerShell không? Liệu nó có một số khả năng tích hợp tương tự hoặc có một lệnh ghép ngắn của bên thứ 3 không?


5
Đóng cửa? Làm thế nào về việc đóng superuser.com/questions 432492 / Mạnh , superuser.com/questions/295021/iêu , superuser.com/questions/71446/ và một số người khác?
Borek Bernard

1
Trên thực tế câu hỏi này có vẻ đủ công bằng với tôi? Nhưng có một câu trả lời cũ: stackoverflow.com/questions/340553/...
Rup

1
Xem bài viết này về việc sử dụng curl trong PowerShell: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Câu trả lời:


100

8
Thay vào đó, bạn có thể muốn lệnh Invoke-WebRequest, tùy thuộc vào những gì bạn đang cố gắng thực hiện.
Timothy Lee Russell

28
Bây giờ nó cũng được đặt biệt danh là curlhoặc wgettrong Powershell.
CMCDragonkai

18
Vâng, thật kỳ lạ khi họ đặt bí danh cho họ, vì cú pháp hoàn toàn khác nhau. Nếu MS không muốn gửi một trình quản lý gói và giúp dễ dàng có được các công cụ cơ bản, phổ biến, việc ẩn nó đằng sau một bí danh giả sẽ không làm cho tình hình trở nên tốt hơn.
MichaelGG

1
Vấn đề lớn nhất với Invoke-WebRequest là nó không hoạt động nếu IE không được 'khởi tạo'; Vì vậy, khi viết các tập lệnh đường ống hoặc DSC, trước tiên bạn phải thực hiện một số công việc cần thiết hoặc bạn có thể sử dụng Invoke-RestMethod.
LimpingNinja

1
@LimpingNinja, bạn có nguồn nào cho việc này không? Có thể vấn đề bạn gặp phải là do vấn đề này: "-UseBasicParsing Sử dụng đối tượng phản hồi cho nội dung HTML mà không cần phân tích cú pháp Mô hình đối tượng tài liệu (DOM). Tham số này được yêu cầu khi Internet Explorer không được cài đặt trên máy tính, như trên cài đặt Server Core của hệ điều hành Windows Server. " từ msdn.microsoft.com/powershell/reference/3.0/ trộm
Michael Kelley

42

Kể từ Powershell 5.0, nếu không phải trước đây, curllà một bí danh cho 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

Để sử dụng lệnh không thiên vị ...

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

Vì vậy, trả lại một số thuộc tính của yêu cầu như sau ...

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

... Hoặc chỉ nội dung ...

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

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

Các lệnh bí danh tương đương là ...

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

Tận dụng mặc định Powershell và các bí danh khác mà bạn có thể rút ngắn các lệnh thành

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

... nhưng tôi sẽ không đề xuất nó. Các lệnh dài dòng giúp người khác khi đọc mã của bạn.

Cập nhật:

Quyền hạn 6.x

Sử dụng bí danh không được khuyến khích

Kể từ Powershell 6.x "Core" curl không còn là bí danh cho Invoke-WebRequest(bí danh wgetcũng bị xóa). Thay vào đó sử dụng Invoke-WebRequesttrực tiếp.

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

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

Curl không còn là bí danh cho Invoke-WebRequest (đã được thử nghiệm trên Powershell 6.2.3), mặc dù đã từ chối rõ ràng một chuyển động trong RFC "để xóa bí danh curl và wget khỏi Windows PowerShell" .

RFC lưu ý rằng "Các bí danh wget / curl đã bị xóa khỏi PowerShell Core, do đó, vấn đề [có các bí danh đó] đã được giới hạn trong Windows PowerShell."

Trong kết luận, nhóm Powershell cũng khuyến khích người dùng "không dựa vào bí danh trong các tập lệnh".

Như @ v6ak đã lưu ý trong các nhận xét sử dụng curlwgettrong PowerShell (5.0 trở xuống) có thể là một vấn đề trong: vô tình gọi curl hoặc wget thực sự nếu được cài đặt cạnh nhau; và, trong mọi trường hợp, gây nhầm lẫn.

Mã hóa mới

Bạn nên nâng cấp "lõi" Powershell (6.x trở lên) để tận dụng lợi thế của mã hóa mặc định utf8NoBOM, khi sử dụng Invoke-WebRequest(và nhiều lệnh xuất văn bản khác). Nếu ai đó đang làm điều này một cách rõ ràng, bạn có thể làm một cái gì đó như:

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 

Tuy nhiên, ngay cả khi sử dụng lệnh ngắn hơn, ẩn, ...

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

... mã hóa utf8NoBOMsẽ được thực hiện (ví dụ, bạn có thể xác minh điều này bằng cách mở tệp đã lưu trong Visual Studio Code và quan sát "UTF-8" trong thanh trạng thái).

Các tệp được lưu với utf8NoBOMxu hướng gây ra ít vấn đề hơn khi đi qua các hệ sinh thái khác nhau. Tất nhiên, nếu bạn cần một số mã hóa khác, bạn có thể đặt một số thay thế rõ ràng.

Trong Powershell 5.0 và thấp hơn utf8NoBOMmã hóa không có sẵn, hãy để mặc định.

Chi tiết:


Cờ -Uri đang làm gì ... Tôi nhận được kết quả tương tự dù có hay không có 'curl -Uri api.github.com/rate_limit '. Tôi đã tìm kiếm cái này, nhưng vẫn không chắc chắn
Drenai

1
Trong powershell, một số tên tham số có thể được bắt nguồn từ thứ tự của các giá trị tham số. Bạn có thể thấy điều này thông qua việc nhìn vào get-help curl. Bạn sẽ thấy Invoke-WebRequest [-Uri] <Uri> ..., với các dấu ngoặc []chỉ ra -Uricó thể bị bỏ qua (và do đó được gọi ngầm). Như tôi đã đề cập trong bài viết chính: nói chung bạn nên rõ ràng (nơi bạn hoặc người khác sẽ đọc mã của bạn trong tương lai).
John Bentley

À - cảm ơn. Vì vậy, tôi bỏ nó ra, nhưng nó vẫn đang được gọi, không biết đó là những gì []đã làm
Drenai

Không có gì. Bạn đã có nó. Các mô tả cú pháp cho các lệnh powershell mà bạn tìm thấy get-helpđược đưa ra trong một số phiên bản của en.wikipedia.org/wiki/Extends_Backus%E2%80%93Naur_form . Bạn sẽ làm tốt để đọc / đọc lướt bởi vì một số phiên bản của Extended Backus Naur Form có thể được sử dụng để mô tả cú pháp của nhiều ngôn ngữ bạn sẽ gặp. Bạn sẽ nhận thấy rằng tại en.wikipedia.org/wiki/ Đá ngoặc [ ...]chỉ định cú pháp là tùy chọn.
John Bentley

Đó là, nhưng tôi đề nghị không sử dụng nó, vì nó gây nhầm lẫn. Trên PowerShell Core 6.1.3 cho Linux, không phải là bí danh cũng không phải là bí danh. Họ đề cập đến curl ban đầu và wget (nếu chúng có mặt trong hệ thống). Vì chúng khác nhau, việc sử dụng các bí danh đó là một nguồn gây nhầm lẫn tiềm năng và các tập lệnh không đa nền tảng.
v6ak

29

Blog Kung Fu dòng lệnh tuyệt vời có một bài đăng nơi họ so sánh các lệnh curl, wget và các lệnh PowerShell có liên quan

Tóm lại:

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

Hoặc, nếu phiên bản Powershell / .Net của bạn không chấp nhận 2 tham số cho DownloadString:

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

Câu trả lời này đề cập đến DownloadFilechức năng cũng hoạt động tốt.
Paul Hicks

15

Bạn cũng có thể cài đặt Git cho Windows , rồi đặt thư mục Git bin vào đường dẫn của bạn. Cài đặt Git bao gồm, trong số những thứ khác, curl.exe. Sau khi cài đặt, chỉ cần đặt %programfiles(x86)%\git\binPATH của bạn. Sau đó, bạn sẽ có thể sử dụng lệnh curl từ bảng điều khiển Windows Command Prompt hoặc PowerShell.



1

thứ gần nhất với wgethoặc curltrên các cửa sổ là các bit (Dịch vụ chuyển thông minh nền), trong đó có một số đoạn mã sẵn sàng cho quyền hạn.


3
Tôi nghĩ BITS giải quyết một vấn đề khác hơn là wget hoặc curl.
Donald Byrd

Tìm nạp mọi thứ từ Máy chủ http?
akira

2
Không :), phần thông minh nền của nó.
Donald Byrd


0

Xoăn

cmd, bash

curl -H "Host: whoami.local" 192.168.4.4

quyền hạn

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.