Windows 8 Hyper-v在guest虚拟机上运行脚本

时间:2014-04-18 20:41:38

标签: c# hyper-v

我希望用MS Hyper-V替换Virtual Box解决方案,因为我在使用Virtual Box的自动化测试套件中遇到了许多不可重现的问题。我有一台Windows 8.1计算机,我将用它来运行测试。

当前的Virtual Box流程:

  1. 启动虚拟机
  2. 重置快照
  3. 使用C#通过网络将文件传输到Guest OS
  4. 使用Virtual Box触发传输的.exe文件以启动自动测试。
  5. 我看到人们使用Powershell Scripts和WMI来启动和停止他们的Hyper-V虚拟机,但我没有看到任何方法来触发客户操作系统上传输的文件。

    我错过了可以使用的API吗?否则我怎么能以编程方式在来宾操作系统上触发EXE?

2 个答案:

答案 0 :(得分:2)

我最终使用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需要一段时间才能查询。

主机和虚拟机需要很多前期工作才能使这个系统发挥作用,我不会在这里讨论,因为谷歌比我更好地解释了这些部分。

该流程旨在匹配使用Virtual Box的另一个系统,因此它似乎有点低效。 这显然需要进行修改以适应每种情况,但应该是Hyper-V Automation的良好起点。

答案 1 :(得分:0)

将文件传输到VM的非常有用的PowerShell CmdLet是Copy-VMFile。

语法在这里解释:

http://technet.microsoft.com/en-us/library/dn464282.aspx

希望这有帮助!