您的位置:首页 > 运维架构 > Shell

Powershell导入并调用公网的ps1脚本中的方法

2017-07-13 17:30 1201 查看
貌似 Powershell 无法直接导入公网上的一些 “ps1” 文件中的函数,所以测试了一下一个比较鸡贼的方法,分享一下。

我们举个例子,之前的 Blog 里面介绍过 Invoke-Parallel 这个方法(http://blog.csdn.net/qwertyupoiuytr/article/details/54142403),但是这个方法非常非常长,如果把这个方法扔到自己的 “ps1” 脚本里面,简直就是灾难,那么有两种方法,一种是把这个文件放到本地,在另外一个
ps1 脚本中调用它,但是有个问题,就是这两个文件到哪里都要一起,不然就引用不到这个文件了。

还有一个方法,就是我们把这个文件放到网盘里(这个例子里面我们放到 Azure 的存储当中,地址http://danielnorthstorage.blob.core.chinacloudapi.cn/fordownload/Invoke-Parallel.ps1),然后在脚本中调用,但是这就遇到了我们最开始提的那个问题,PS
貌似无法直接远程调用公网上的脚本文件。

我们看一下下面的代码:

$scriptSrc = "http://danielnorthstorage.blob.core.chinacloudapi.cn/fordownload/Invoke-Parallel.ps1";
$dest = ".\tmpScript.ps1";
$wc = New-Object System.Net.WebClient;
$wc.DownloadFile($scriptSrc, $dest);

# import all the functions in the script file
. ".\tmpScript.ps1";

// Do something with Invoke-Parallel function

Remove-Item -Path ".\tmpScript.ps1";

代码里面我们使用 WebClient 对象的 DownloadFile 方法,将 ps1 脚本下载到了当前脚本的同级目录中,并重命名为 tmpScript.ps1,下载后,我们使用命令 . ".\tmpScript.ps1" 将脚本中的方法(这个脚本里面我们只有一个 Invoke-Parallel 方法)导入到当前执行上下文中,然后我们就可以在当前脚本中调用 Invoke-Parallel 方法了,调用完成后,我们再将临时的文件删除掉即可。

我们具体写一个简单的小例子,批量开启Azure ARM虚拟机:

$scriptSrc = "http://danielnorthstorage.blob.core.chinacloudapi.cn/fordownload/Invoke-Parallel.ps1";
$dest = ".\tmpScript.ps1";
$wc = New-Object System.Net.WebClient;
$wc.DownloadFile($scriptSrc, $dest);

# import all the functions in the script file
. ".\tmpScript.ps1";

$ResourceGroupName = "XXXXXXXX";
$VMNames = "VM1;VM2;VM3";
$VMNames.Split(';') | Invoke-Parallel -ImportVariables -NoCloseOnTimeout -ScriptBlock { Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $_ };

Remove-Item -Path ".\tmpScript.ps1";



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息