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

评论

关闭?如何关闭superuser.com/questions/34492/…、superuser.com/questions/295021/…、superuser.com/questions/71446/…以及其他主机?

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

查看有关在PowerShell中使用curl的文章:thesociablegeek.com/azure/using-curl-in-powershell

#1 楼

PowerShell 3.0具有新命令Invoke-RestMethod

http://technet.microsoft.com/zh-cn/library/hh849971.aspx

更多详细信息:

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

评论


您可能需要Invoke-WebRequest命令,具体取决于您要完成的工作。

–提莫西·李·罗素(Timothy Lee Russell)
2014年6月10日16:32

现在在Powershell中,它也被别名为curl或wget。

– CMCDragonkai
2014年6月12日下午5:49

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

– MichaelGG
2014年11月7日在20:08

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

–LimpingNinja
17年5月22日在15:27

@LimpingNinja,您有这个消息来源吗?也许您遇到的问题是由于以下原因引起的:“-UseBasicParsing使用响应对象进行HTML内容,而没有文档对象模型(DOM)解析。当计算机上未安装Internet Explorer时(例如在服务器核心安装中),此参数是必需的Windows Server操作系统。”来自msdn.microsoft.com/powershell/reference/3.0/…

– Michael Kelley
17年5月22日在19:24



#2 楼

从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


要使用非别名命令...

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


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

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

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

正如@ v6ak在注释中指出的那样,在PowerShell(5.0或更低版本)中使用curlwget可能会出现以下问题:如果并排安装,则无意调用真正的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”来进行验证) bar)。

utf8NoBOM保存的文件在各种生态系统中旅行时,所引起的问题往往较少。当然,如果需要其他编码,则可以显式设置一些替代方法。

在Powershell 5.0中,请降低utf8NoBOM的编码不可用,更不用说默认编码了。

详细信息:


Powershell 6,参考,Microsoft.PowerShell.Utility,文件外,参数,-Encoding
Powershell 6,Powershell Core 6.x的新功能和新功能,Powershell Core 6.0中的重大更改,“将$ OutputEncoding更改为使用UTF-8 NoBOM编码而不是ASCII#5369”


评论


-Uri标志的作用是什么...无论是否使用“ curl -Uri api.github.com/rate_limit”,我都会得到相同的结果。我已经搜索过,但仍不确定

–德雷奈
17年7月28日在8:35

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

–约翰·本特利
17年7月30日在22:59

啊-谢谢所以我省略了它,但是它仍在被调用,不知道那是[]所做的

–德雷奈
17年7月31日在10:22

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

–约翰·本特利
17年8月1日在10:55



是的,但我建议您不要使用它,因为它会令人困惑。在Linux的PowerShell Core 6.1.3上,curl和wget都不是别名。它们指的是原始的curl和wget(如果它们存在于系统中)。由于它们不同,因此这些别名的使用可能会造成混乱和非跨平台脚本。

– v6ak
19年3月7日在16:04

#3 楼

优秀的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版本不接受DownloadString的2个参数:

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


评论


这个答案提到了DownloadFile函数,该函数也很好用。

– Paul Hicks
16年5月19日在22:36

#4 楼

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

#5 楼

您可以使用Chocolatey安装cURL,并可以在PowerShell CLI或cmd中使用curl。

评论


然后为此connect.microsoft.com/PowerShell/feedbackdetail/view/1089296/…投票

–威廉姆斯
15年1月15日在23:46

#6 楼

在Windows上,最接近wgetcurl的是位(Background Intelligent Transfer Service),它具有一些准备用于Powershell的摘要。

评论


我认为BITS解决的问题不同于wget或curl。

–唐纳德·伯德
2012年7月7日在1:08

从Http服务器获取内容?

– akira
2012年7月7日在19:03

否:),它的背景情报部分。

–唐纳德·伯德
2012年7月7日在20:03

#7 楼

curl

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


#8 楼

如果您使用内部预览版本17063或版本1803及更高版本,那么已经有curl.exe您可以直接运行

如果您是其中的一员,祝您新年快乐! 🙂Windows 10 Insider内部版本17063和更高版本现在包含可以直接从Cmd或PowerShell执行的真实的curl和tar可执行文件。
Tar和Curl到Windows!

在PowerShell上,您如果curl.exe是现有别名,则需要显式运行curl

#9 楼

此命令应该起作用:

Invoke-WebRequest -UseBasicParsing -Uri http://example.com/


从PowerShell 3.0开始,它是Microsoft.PowerShell.Utility的一部分。

另请参阅:获取$ webclient.downloadstring在Powershell中写入文本文件。