如何在 Windows 10,11 上使用 CLI 或 Powershell 命令执行curl

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。

mkl*_*nt0 5

您自己的有效解决方案提供更简洁的替代方案- 还假设从 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

    • 请注意,虽然Invoke-Expression通常要避免,但在这里它允许执行源代码而不需要辅助。脚本文件( .ps1)。

    • [scriptblock]::Create($sourceCodeString)是一种将源代码解析为脚本块(其文字形式为)的方法,即可以在以后按需{ ... }调用的可重用代码单元,使用调用运算符或点源运算符。 它的使用绕过了以下错误,至少在 PowerShell 7.3.3 中存在:&.
      Invoke-Expression

  • 由于上述命令不涉及脚本文件,因此不适用有效的执行策略。 顺便说一句:如果是的话:

    • 您可以使用给定的CLI调用覆盖它-ExecutionPolicy Bypass
    • 您可以使用来持久Set-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名。

  • 如果您只关心响应的数据,而不关心包装数据的丰富响应信息对象,则可以使用相关的Invoke-RestMethodcmdlet(其内置别名为irm)来代替。Invoke-WebRequest

    • 注意:纯文本数据(例如您的情况下的脚本源代码)按原样返回,但对于基于 XML 和 JSON 的数据,Invoke-RestMethod可以方便地将数据解析为[xml]( System.Xml.XmlDocument) 实例和分别是自定义对象图 ( [pscustomobject])。

[1] 仅当您完全控制或隐式信任脚本的内容时才执行此操作,以防止潜在的恶意代码执行。