PowerShell 中是否有等效项curl
?它是否具有一些类似的内置功能或是否有第三方cmdlet?
答案1
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/
答案2
从 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“核心” 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 或更低版本)中使用curl
和wget
可能会出现问题:如果并排安装,则会无意中调用真正的 curl 或 wget;并且在任何情况下都会造成混淆。
新编码
utf8NoBOM
建议您升级 Powershell“核心”(6.x 或更高版本),以便在使用(以及许多其他文本输出命令)时利用默认编码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
编码不可用,更不用说默认编码了。
细节:
答案3
优秀的命令行功夫博客有一个帖子比较 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"
答案4
您还可以安装适用于 Windows 的 Git,然后将 Git bin 文件夹放入您的路径中。Git 安装包括 curl.exe 等。安装后,只需放入%programfiles(x86)%\git\bin
您的 PATH 中。然后,您将能够从 Windows 命令提示符或 PowerShell 控制台使用 curl 命令。