Windows 8 Hyper-v在来宾上运行脚本
本文关键字:运行 脚本 Hyper-v Windows | 更新日期: 2023-09-27 17:58:54
我希望用MS Hyper-V取代虚拟盒子解决方案,因为我在使用虚拟盒子的自动化测试套件中遇到了许多不可复制的问题。我有一台Windows 8.1计算机,我将使用它来运行测试。
当前虚拟盒流程:
- 启动虚拟机
- 重置快照
- 使用C#通过网络将文件传输到来宾操作系统
- 使用虚拟盒触发传输的.exe文件以启动自动测试
我看到人们使用Powershell脚本和WMI来启动和停止他们的Hyper-V虚拟机,但我看不出有任何方法可以触发Guest操作系统上传输的文件。
我是否缺少可以使用的API?否则,我如何以编程方式触发来宾操作系统上的EXE?
我最终使用了System.Management.Automation.PowerShell
。我将分享我用来完成每一步的主要代码块,以便未来的用户能够获得帮助。
主代码块
var ps = PowerShell.Create();
//Restore Snapshots
ps.AddCommand("Restore-VMSnapshot");
ps.AddParameter("Name", snapshot);
ps.AddParameter("VMName", vmName);
ps.AddParameter("Confirm", false);
ps.Invoke();
ps.Commands.Clear();
//Start VM
ps.AddCommand("Start-VM");
ps.AddParameter("Name", vmName);
ps.Invoke();
ps.Commands.Clear();
//Get IP
string[] ipValues = null;
do
{
ps.AddCommand("Get-VMNetworkAdapter");
ps.AddParameter("VMName", vmName);
var ips = ps.Invoke();
ps.Commands.Clear();
if (ips.Count > 0)
{
ipValues = (string[])ips[0].Members["IPAddresses"].Value;
}
} while (ipValues.Length ==0);
string ip = ipValues[0];
//Move Exe to VM
File.Copy(@"...", "''''" + ip + "''Users''Public''Documents''...", true);
//Run Program
ps.AddScript("$Username = '...'; $Password = '...' ;$ComputerName = '"+ip+"' ;"+
"$Script = {Start-Process C:''Users''Public''Documents''....exe} ;$secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force ;"+
"$mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd) ;"+
" $Session = New-PSSession -ComputerName $ComputerName -credential $mycreds ; Invoke-Command -Session $Session -Scriptblock $Script");
var passwords = ps.Invoke();
ps.Commands.Clear();
备注
//GetIP
部分是do{}while()
,因为IP需要一段时间才能查询。
主机和虚拟机需要大量的前期工作才能使这个系统发挥作用,我不会在这里讨论,因为谷歌比我更好地解释了这些部分。
该流被设计为与另一个使用虚拟盒的系统相匹配,因此它可能看起来有点低效。这显然需要修改以适应每种情况,但应该是Hyper-V自动化的一个很好的起点。
将文件传输到VM的非常有用的PowerShell CmdLet是Copy VMFile。
语法解释如下:
http://technet.microsoft.com/en-us/library/dn464282.aspx
希望这能有所帮助!