Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Powershell下载脚本文件,然后通过传入参数执行它?_Powershell - Fatal编程技术网

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

如何使用Powershell下载脚本文件,然后通过传入参数执行它?,powershell,Powershell,我通常使用以下命令来运行某些powershell脚本: &“\NuGet\NuGet Package and Publish.ps1”-版本$env:appveyor\u build\u版本-NuGet”C:\Tools\NuGet\NuGet.exe”-apiKey$env:apiKey 工作正常,但脚本在我的服务器上本地找到 我希望说:用参数运行这个脚本,等等。。好的但该脚本被定位为要点或某些GitHub公共回购协议 这可能吗?如果我正确理解了这个问题,这就是对我有效的方法: (new-ob

我通常使用以下命令来运行某些powershell脚本:

&“\NuGet\NuGet Package and Publish.ps1”-版本$env:appveyor\u build\u版本-NuGet”C:\Tools\NuGet\NuGet.exe”-apiKey$env:apiKey

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

我希望说:用参数运行这个脚本,等等。。好的但该脚本被定位为要点或某些GitHub公共回购协议


这可能吗?

如果我正确理解了这个问题,这就是对我有效的方法:

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

使用参数调用:参数标题


这是下载并执行以下要点:

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

下面是一个安装chef的示例

同样的事情也可以通过powershell实现

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install
iwr
Invoke WebRequest
的缩写,
iex
Invoke Expression

由于您特别询问了传入参数的问题,下面是一个使用args的示例

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel current -project chefdk
你可以更清楚地了解它是如何工作的

基本上,将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'
}

最佳做法

“PipingtoBash”是有争议的,因为如果您不小心的话,攻击者理论上可能会拦截您的脚本并用自己的脚本替换

  • 仅安装您控制或完全信任的脚本
  • 或者验证下载文件的哈希值
  • 仅从https下载

是否从在线资源下载,然后运行?我错过了什么?@zespri我不知道如何在powershell中做到这一点?或者即使这是可能的?所以问题相当于“如何使用powershell从internet下载文件?”。。。然后执行文件的内容(内容是一个脚本)——并——将参数传递给该(下载的)脚本。(也很乐意将问题重命名为主题:)你能将要点下载到inmemory对象中,然后执行它(提供参数)?我们没有文件访问权限。是的,您可以使用
调用表达式
,但您需要处理参数传递。这可能不是一件很简单的事情——取决于参数。查看下载/安装脚本。你可以做类似的事情,你只需要知道如何传递参数,因为巧克力没有。是的。我希望你会说“使用
iex
。。但当我试图传递args给它时,我从来没有这样做过…对不起。将缺少文件系统访问添加到问题中,因为这是information.Np的关键部分。没有缺席。我只是想知道,如果文件系统访问被拒绝,是否也可以使用iex来回答。
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'
}