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

gblwokeq  于 2023-04-07  发布在  Windows
关注(0)|答案(2)|浏览(400)

想在Linux下的Bash中找到类似的东西吗

sh <(curl https://sample.com/cli.sh)

在Windows CLI或PowerShell中
我知道curl安装在Windows中。我如何才能实现它?
有些人会说它是不安全的。我也会有一个cliiderps1与Windows Powershell。

roqulrg3

roqulrg31#

your own effective solution提供更简洁的替代方案-还假设从PowerShell* 执行 *;关于直接执行从Web下载的代码的常见警告:[1]

powershell { iex (irm https://sample.com/cli.ps1) }

存在上述故障的边缘情况(见下文);然后使用下面的健壮形式,这也使得将 arguments传递给脚本变得容易:

# More robust:
# Optionally pass arguments before the closing "}"
powershell { & ([scriptblock]::Create((irm https://sample.com/cli.ps1))) }

假设你知道脚本不包含exit语句(这将退出 * 你的整个会话 ),你甚至可以使用进程内 * 执行(就像你通过辅助文件的解决方案一样),如下所示:

# 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)))

进程内执行不仅速度更快,而且还使脚本能够直接修改当前会话的环境变量,并保持脚本输出对象的完整类型保真度(如果有的话)。
如果脚本 * 确实 * 有exit语句,则必须首先下载到(临时)* 文件 *(如您的解决方案中所示),尽管下面讨论的建议的未来增强功能将使其变得不必要。
注意事项:

  • irmInvoke-RestMethod cmdlet的内置别名-有关详细信息,请参阅下一节。
  • iexInvoke-Expression cmdlet的内置别名。
  • 请注意,虽然Invoke-Expressiongenerally to be avoided,但在这里,它可以在不需要辅助脚本 * 文件 *(.ps1)的情况下执行源代码。
  • [scriptblock]::Create($sourceCodeString)是一种将源代码解析为script block(其文字形式为{ ... })的方法,即可以在以后使用&(调用操作符)或.(点源操作符)按需调用的可重用代码单元。

它的使用绕过了以下Invoke-Expression错误,至少在PowerShell 7.3.3中存在:

顺便说一句:如果是:

  • 对于给定的CLI调用 *,您可以使用-ExecutionPolicy Bypass覆盖它
  • 您可以使用Set-ExecutionPolicy将其设置为 * 永久 *,如您自己的答案所示-请参阅this answer了解背景信息。
    • 未来可能的增强 *:
  • GitHub issue #5909讨论了增强Invoke-Command cmdlet,以基于Invoke-WebRequest调用作为管道输入,直接从Web强大地支持脚本的执行。
  • 如果实现了这一点,一个健壮的进程内调用将如下所示(分别使用Invoke-WebRequestInvoke-Command的内置别名iwricm):
# WISHFUL THINKING as of PowerShell 7.3.3
# Append -- arg1 ... to pass arguments.
iwr https://sample.com/cli | icm
curl vs. curl.exe vs. Invoke-WebRequest vs. Invoke-RestMethod
  • curl.exe确实随Windows的最新版本而来。
  • 要从 Windows PowerShell 调用它,请确保将其 * 称为curl.exe *,即 * 带有 * .exe扩展名。
  • 在Windows PowerShell中,curl(* 不含 * .exe部分)是Invoke-WebRequest cmdlet的 * 别名 *,Invoke-WebRequest cmdlet是PowerShell对curl.exe的 * 模拟 *,尽管语法非常不同。

幸运的是,这个别名已从PowerShell (Core) 7+中删除。
但是,可以在两个PowerShell版本中使用的内置PowerShell惯用别名是iwr,用于引用Invoke-WebRequest

  • 相关的Invoke-RestMethod cmdlet(其内置别名为irm)可用于代替Invoke-WebRequest,以满足以下情况:您只关心响应的 * 数据 *,而不关心 Package * 数据的丰富响应信息对象。
  • 注意:纯文本数据(如脚本的源代码)按原样返回,但对于基于XML和JSON的数据,Invoke-RestMethod可以方便地将数据分别解析为[xml]System.Xml.XmlDocument)示例和自定义对象图([pscustomobject])形式的XML DOM。

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

lymnna71

lymnna712#

这个方法的作用是:

set-ExecutionPolicy RemoteSigned -Scope CurrentUser
$cli = Invoke-WebRequest -Uri https://server.com/cli-win.txt
$cli.Content > cli.ps1
./cli.ps1

相关问题