我通常有这个命令来运行一些powershell脚本:
& ".\NuGet\NuGet Package and Publish.ps1" -Version $env:appveyor_build_version -NuGet "C:\Tools\NuGet\nuget.exe" -apiKey $env:apiKey
工作正常但脚本在我的服务器上本地找到。
我希望这样说:用参数等运行这个脚本..很好......但脚本位于GIST或某些GitHub公共仓库中。
这可能吗?
答案 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
iwr
是Invoke-WebRequest
的简写,iex
是Invoke-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”是有争议的,因为如果你不小心,攻击者理论上可以拦截并用自己的脚本替换你的脚本。答案 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