如何使用Powershell下载脚本文件然后通过传入参数执行它?

时间:2015-10-19 01:33:52

标签: powershell

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

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

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

我希望这样说:用参数等运行这个脚本..很好......但脚本位于GIST或某些GitHub公共仓库中。

这可能吗?

2 个答案:

答案 0 :(得分:6)

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

以下是安装主厨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下载

答案 1 :(得分:3)

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

(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