相当于curl的PowerShell


145

curl在PowerShell中是否有等效功能?它是否具有一些类似的内置功能,或者是否有第三方方cmdlet?



1
其实这个问题对我来说看起来很公平?但是,这里有一个古老的答案:stackoverflow.com/questions/340553/…–
Rup

1
看看这篇文章关于在PowerShell中使用curl: thesociablegeek.com/azure/using-curl-in-powershell
SDsolar

Answers:


100

8
您可能要使用Invoke-WebRequest命令,具体取决于您要完成的工作。
Timothy Lee Russell

28
现在,它也被别名为Powershell curlwget
CMCDragonkai 2014年

18
是的,因为它们的语法完全不同,所以给它们起别名是很奇怪的。如果MS不想交付软件包管理器并使其易于获得通用的基本工具,则将其隐藏在伪造的别名后面不会使情况变得更好。
MichaelGG 2014年

1
Invoke-WebRequest的最大问题是,如果未“初始化” IE,它将无法正常工作。因此,在编写管道或DSC脚本时,您必须先做一些额外的工作,或者可以使用Invoke-RestMethod。
LimpingNinja '17

1
@LimpingNinja,您有这个消息来源吗?也许您遇到的问题是由于以下原因引起的:“-UseBasicParsing使用响应对象来处理HTML内容,而没有文档对象模型(DOM)解析。当计算机上未安装Internet Explorer时(例如在Server Core安装中),此参数是必需的Windows Server操作系统。” 来自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

...但是我不推荐它。详细的命令在阅读代码时会帮助其他人。

更新:

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

尽管显然拒绝RFC中的“从Windows PowerShell中删除curl和wget别名”运动,但Curl不再是Invoke-WebRequest的别名(在Powershell 6.2.3上进行了测试)。

RFC指出“ wget / curl别名已从PowerShell Core中删除,因此[具有这些别名]的问题仅限于Windows PowerShell。”

最后,Powershell团队还鼓励用户“不要依赖脚本中的别名”。

正如@ v6ak在注释中指出的那样,使用curlwget在PowerShell(5.0或更低版本)中使用和可能是一个问题:如果并排安装,则无意调用真正的curl或wget;并且在任何情况下都会引起混乱。

新编码

建议您升级Powershell“核心”(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 ',我都会得到相同的结果 。我已经搜索过了,但仍然不确定
Drenai

1
在powershell中,某些参数名称可以从参数值的顺序隐式派生。您可以通过查看看到这一点get-help curl。您将看到Invoke-WebRequest [-Uri] <Uri> ...,括号中的[]指示-Uri可以忽略(因此可以隐式调用)。正如我在主要文章中提到的那样:通常,您应该明确(将来您或其他人将在这里阅读您的代码)。
约翰·本特利

啊-谢谢 因此,我将其省略,但是它仍在被调用,不知道那是怎么[]做的
-Drenai

别客气。知道了 get-help在某些版本的en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form中提供了可在其中找到的Powershell命令的语法说明。您会很好地阅读/略读一下,因为某些版本的Extended Backus Naur Form可能用于描述您会遇到的许多语言的语法。您会注意到,在en.wikipedia.org/wiki/…括号中[ ...]指定了可选的语法。
约翰·本特利

是的,但我建议不要使用它,因为它会令人困惑。在Linux的PowerShell Core 6.1.3上,curl和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

您也可以安装Windows版Git,然后将Git bin文件夹放入路径中。Git安装包括curl.exe等。安装后,只需%programfiles(x86)%\git\bin输入您的PATH。然后,您将能够从Windows命令提示符或PowerShell控制台使用curl命令。



1

与Windows wgetcurlWindows上最接近的东西是(Background Intelligent Transfer Service),其中有一些片段可供Powershell使用。


3
我认为BITS解决的问题不同于wget或curl。
唐纳德·伯德

从Http服务器获取内容?
akira 2012年

2
否:),它的背景情报部分。
唐纳德·伯德


0

卷曲

cmd,bash

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.