【问题标题】:How to use Powershell to download a script file then execute it with passing in arguments?如何使用 Powershell 下载脚本文件,然后通过传入参数执行它?
【发布时间】:2016-11-10 13:42:28
【问题描述】:

我通常有这个命令来运行一些 powershell 脚本:

& ".\NuGet\NuGet Package and Publish.ps1" -Version $env:appveyor_build_version -NuGet "C:\Tools\NuGet\nuget.exe" -apiKey $env:apiKey

工作正常,但脚本是在我的服务器上本地找到的。

我想说的是:使用参数等运行此脚本。很好.. 但该脚本位于 GIST 或某些 GitHub 公共存储库中。

这可能吗?

【问题讨论】:

  • 你从你的在线资源下载它然后运行?我错过了什么?
  • @zespri 我不知道如何在PowerShell中做到这一点?或者即使这是可能的?
  • 所以问题相当于“如何使用 powershell 从 Internet 下载文件?”
  • ... 然后执行文件的内容(内容是一个脚本)——并且——将参数传递给那个(下载的)脚本。 (也很高兴重命名问题主题:))

标签: powershell


【解决方案1】:

在 linux 世界中,这通常被称为“管道到 bash”

这里是一个安装chef taken from the chef documentation的例子

curl -L https://omnitruck.chef.io/install.sh | sudo bash

同样的事情也可以用 powershell 来完成

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install

iwrInvoke-WebRequest 的简写,iexInvoke-Expression 的简写

由于您特别询问有关传入参数的问题,因此这里有一个带有 args 的示例。

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel current -project chefdk

您可以look at the powershell script 更清楚地了解它的工作原理。

基本上将您的 powershell 脚本托管为 github gist,然后在脚本中将所有内容包装在一个模块中

new-module -name foobar -scriptblock {


  Function Foo() {

  }
  Function Bar() {

  }
  Function Install-Project() {
    param (
      [string]$project = 'chef',
      [string]$channel = 'stable'
    )
    Foo
    Bar
  }

  set-alias install -value Install-Project

  export-modulemember -function 'Foo','Bar' -alias 'install'
}

最佳实践

'Piping to bash' 是有争议的,因为如果你不小心,理论上攻击者有可能拦截并用他们自己的脚本替换你的脚本。

  • 仅安装您可以控制或完全信任的脚本
  • Use permalinks 或验证您下载的文件的哈希值
  • 只能从 https 下载

【讨论】:

    【解决方案2】:

    如果我正确理解了这个问题,这对我有用:

    (new-object net.webclient).DownloadFile('https://gist.githubusercontent.com/AndrewSav/c4fb71ae1b379901ad90/raw/23f2d8d5fb8c9c50342ac431cc0360ce44465308/SO33205298','local.ps1')
    ./local.ps1 "parameter title"
    

    输出:

    使用参数调用:参数标题

    这是下载和执行这个要点:https://gist.github.com/AndrewSav/c4fb71ae1b379901ad90

    【讨论】:

    • 你能把那个要点下载到一个内存对象中,然后执行它(提供参数给它)吗?例如 - 我们没有文件访问权限。
    • 是的,您可以使用Invoke-Expression,但您需要处理参数传递。让它正确可能不是很简单 - 取决于参数。查看Chocloatey 下载/安装脚本。你可以做类似的事情,你只需要弄清楚如何传递参数,因为巧克力没有。
    • 是的。我希望你可能会说“使用iex .. 但是当我尝试将 args 传递给那个时我从来没有这样做过......
    • 对不起。在问题中添加没有文件系统访问权限,因为这是关键信息。
    • Np。它并不缺席。我只是看看在文件系统访问被拒绝的情况下是否也可以使用iex 来完成答案。
    猜你喜欢
    • 2021-10-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多