一、powershell安装hyper-v模块

WinRM的配置使用 篇中提到如何通过开启WINRM进行powershell远程管理,接下来说下如何和hyper进行结合。win2008下的powershell默认不带hyper模块,win2008R2下需要使用开源项目PsHyperV 。也可以去github上进行下载。地址如下:https://github.com/gcbond/pshyperv ,下载后,可以打开压缩包,直接运行install.cmd进行安装,这里注意,需要使用管理员权限进行安装。如果不选择管理员权限,会报如下错误:

pshyperv
pshyperv

安装完成后,可以在powershell下通过如下命令进行操作(获取帮助信息可以通过Get-Help Get-VM):

get-vm
Start-VM
Stop-VM

具体可以参考 powershell中和hyper-v的api

get-vm
get-vm

2012R2下PowerShell自带HyperV模块,打开PowerShell命令行,即可使用HyperV模块的函数。具体可以参考微软官方页面:https://docs.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/try-hyper-v-powershell

2012R2下的HyperV模块的函数比2008R2的更加全面,同时2012R2下的大部分函数名及函数参数也发生了变化。如下:

function-hyperv
function-hyperv

二、powershell + hyper-v虚机管理

win2008下直接打开powershell或者远程直接powershell调用还是会出现异常提示的,如下:

hyper-vm
hyper-vm

解决该问题,是需要导入模块,才可以调用:

1Import-Module "C:Program FilesmodulesHyperV"
2get-vm

powershell下直接进行远程命令调用还需要使用invoke-command命令,如下:

1# 远程执行命令
2invoke-command -computername 192.168.21.1 -Credential $cred -command {dir C:/}
3invoke-command -computername 192.168.21.1 -Credential $cred -ScriptBlock {dir c:}
4# 远程执行脚本
5echo "dir c:" > dirDriveC.ps1
6invoke-command -computername 192.168.21.1 -Credential $cred  -FilePath .dirDriveC.ps1

具体可以参考:windows服务器远程执行命令(PowerShell+WinRM)

三、一键式最终实现

由于powershell在主机上是无法直接调用使用的,直接使用会报错:’无法加载文件 D:hyperstatus-hyperhost.ps1,因为在此系统中禁止执行脚本。有关详细信息,请参阅 “get-help about_signing”‘。解决该问题的办法可以通过cmd调用时,使用相关参数,如下:

1powershell.exe -ExecutionPolicy Bypass -File 文件名.ps1
2
3或者永久的改变本机的 PowerShell 执行策略(不推荐,不安全):
4Set-ExecutionPolicy Bypass

该部分参考:《更好的批处理脚本语言 PowerShell

最终实现的有如下6个文件:

1PS D:hyper> ls|select Name
2Name
3----
401status.bat
502stop.bat
603start.bat
7start-hyperhost.ps1
8status-hyperhost.ps1
9stop-hyperhost.ps1

对应的状态查看脚本内容如下:

 1# 01status.bat内容如下:
 2@echo off
 3powershell.exe -ExecutionPolicy Bypass -File  status-hyperhost.ps1
 4echo ============================================
 5echo OnTimeInMilliseconds:表示当前运行时间
 6echo ElementName:表示当前虚机名称
 7echo ============================================
 8pause
 9# status-hyperhost.ps1文件内容如下:
10$account = "USER-20180228WDadministrator"
11$password = 'mypasswd'
12$secpwd = convertto-securestring $password -asplaintext -force
13$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
14invoke-command -computername 10.73.157.125 -Credential $cred -ScriptBlock {Import-Module "C:Program FilesmodulesHyperV";get-vm|select ElementName,OnTimeInMilliseconds}

停掉虚拟机脚本如下:

 1# 02stop.bat文件内容如下:
 2@echo off
 3powershell.exe -ExecutionPolicy Bypass -File  stop-hyperhost.ps1
 4pause
 5# stop-hyperhost.ps1内容如下:
 6$account = "USER-20180228WDadministrator"
 7$password = 'mypasswd'
 8$secpwd = convertto-securestring $password -asplaintext -force
 9$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
10invoke-command -computername 10.73.157.125 -Credential $cred -ScriptBlock {Import-Module "C:Program FilesmodulesHyperV";stop-vm "MGHZOA-WEB(10.73.157.124)" -Force;sleep 10;stop-vm "MGHZOA-CW01(10.73.157.126)" -Force;stop-vm "MGHZOA-DB(10.73.157.123)" -Force}
11invoke-command -computername 10.73.157.125 -Credential $cred -ScriptBlock {Import-Module "C:Program FilesmodulesHyperV";get-vm|select ElementName,OnTimeInMilliseconds }

启动虚机脚本如下:

 1# 03start.bat内容如下:
 2@echo off
 3powershell.exe -ExecutionPolicy Bypass -File  start-hyperhost.ps1
 4pause
 5# start-hyperhost.ps1文件内容如下:
 6$account = "USER-20180228WDadministrator"
 7$password = 'mypasswd'
 8$secpwd = convertto-securestring $password -asplaintext -force
 9$cred = new-object System.Management.Automation.PSCredential -argumentlist $account,$secpwd
10invoke-command -computername 10.73.157.125 -Credential $cred -ScriptBlock {Import-Module "C:Program FilesmodulesHyperV";start-vm "MGHZOA-CW01(10.73.157.126)";start-vm "MGHZOA-DB(10.73.157.123)";sleep 15;start-vm "MGHZOA-WEB(10.73.157.124)";}
11invoke-command -computername 10.73.157.125 -Credential $cred -ScriptBlock {Import-Module "C:Program FilesmodulesHyperV";get-vm|select ElementName,OnTimeInMilliseconds }
12echo "=================================="
13echo "三台虚拟机启动中……"
14echo "等待后台进程运行"
15sleep 80
16echo "打开合同页面,请查看浏览器页面:"
17Start-Process -FilePath http://10.73.157.124/workflow/UserLogin.aspx

不过这个调用是有窗口进行查看的,如果不想要进行窗口显示,也可以通过vbs调用powershell,类似如下:

1command = "powershell.exe -nologo -command D:Hyper-Vtest.ps1"
2set shell = CreateObject("WScript.Shell")
3shell.Run command,0