dev*_*dev 2 windows powershell curl invoke-webrequest
想要在 Linux 下的 Bash 中找到与此等效的内容
sh <(curl https://sample.com/cli.sh)
Run Code Online (Sandbox Code Playgroud)
在 Windows CLI 或 Powershell 中
我知道Windows 中安装了curl。我怎样才能实现它?
有人会说这样不安全。我还将有一个带有 Windows Powershell 的 cli.ps1。
为您自己的有效解决方案提供更简洁的替代方案- 还假设从 PowerShell执行;关于直接执行从网络下载的代码的常见注意事项适用:[ 1]
powershell { iex (irm https://sample.com/cli.ps1) }
Run Code Online (Sandbox Code Playgroud)
存在上述故障的边缘情况(见下文);然后使用以下健壮的形式,这也使得将参数传递给脚本变得容易:
# More robust:
# Optionally pass arguments before the closing "}"
powershell { & ([scriptblock]::Create((irm https://sample.com/cli.ps1))) }
Run Code Online (Sandbox Code Playgroud)
假设您知道脚本不包含任何exit语句(这将退出整个会话),您甚至可以使用进程内执行(就像您通过 aux. 文件的解决方案所做的那样),如下所示:
# Note: Execution via & { ... } prevents iex (Invoke-Expression) from
# effectively dot-sourcing the code, i.e. from running it
# directly in the calling scope, which can have unwanted side effects.
iex "& { $(irm https://sample.com/cli.ps1) }"
# More robust:
& ([scriptblock]::Create((irm https://sample.com/cli.ps1)))
Run Code Online (Sandbox Code Playgroud)
进程内执行不仅速度更快,还使脚本能够直接修改当前会话的环境变量,并保持脚本输出对象(如果有)的完整类型保真度。
如果脚本确实有exit语句,则有必要首先下载到(临时)文件(如您的解决方案中所示),尽管下面讨论的建议的未来增强功能将使这种操作变得不必要。
笔记:
irm是 cmdlet 的内置别名Invoke-RestMethod- 有关详细信息,请参阅下一节。
iex是 cmdlet 的内置别名Invoke-Expression。
由于上述命令不涉及脚本文件,因此不适用有效的执行策略。
顺便说一句:如果是的话:
-ExecutionPolicy BypassSet-ExecutionPolicy设置它,就像您自己的答案一样 - 请参阅此答案以获取背景信息。未来潜在的增强:
GitHub 问题 #5909讨论了增强Invoke-Commandcmdlet,以基于作为管道输入的调用,强有力地支持直接从 Web 执行脚本Invoke-WebRequest。
如果实现了这一点,一个健壮的进程内调用将如下所示(分别使用内置别名iwr以及和icm的别名):Invoke-WebRequestInvoke-Command
# WISHFUL THINKING as of PowerShell 7.3.3
# Append -- arg1 ... to pass arguments.
iwr https://sample.com/cli | icm
Run Code Online (Sandbox Code Playgroud)
curl对比curl.exe对比Invoke-WebRequest对比Invoke-RestMethod:curl.exe确实随最新版本的 Windows 一起提供。
要从Windows PowerShell调用它,请确保将其称为,curl.exe即带有扩展.exe名。
curl(没有该.exe部分)是cmdlet的别名,它与Invoke-WebRequestPowerShell类似curl.exe,但语法非常不同。幸运的是,这个别名已从PowerShell (Core) 7+Invoke-WebRequestiwr如果您只关心响应的数据,而不关心包装数据的丰富响应信息对象,则可以使用相关的Invoke-RestMethodcmdlet(其内置别名为irm)来代替。Invoke-WebRequest
Invoke-RestMethod可以方便地将数据解析为[xml]( System.Xml.XmlDocument) 实例和分别是自定义对象图 ( [pscustomobject])。[1] 仅当您完全控制或隐式信任脚本的内容时才执行此操作,以防止潜在的恶意代码执行。