使用C#从PowerShell cmdlet重新启动Hyper V虚拟机

3

我正在尝试构建一个应用程序来重启 Hyper V 中 Server 2012 的虚拟机。 我已经让列表中的每个虚拟机重新启动了,但我希望将其改为关闭然后再开启机器。注释掉的代码是可强制重启的工作代码。 提前感谢。

public async static void RestartAllVMs(List<VM> vmList, int timeDelay)
    {
        PowerShell ps = PowerShell.Create();
        foreach (VM vm in vmList)
        {
            /*//Create PowerShell object
            PowerShell ps = PowerShell.Create();
            ps.AddCommand("Restart-VM");
            ps.AddArgument(vm.vmName);
            ps.AddParameter("Force");
            ps.Invoke();
            await Task.Delay(timeDelay * 1000);*/

            //Create PowerShell object
            //I want to run from here down instead of just restarting the code doesn't work and no errors are thrown.
            ps.AddCommand("Stop-VM");
            ps.AddArgument(vm.vmName);
            ps.AddCommand("Start-Sleep");
            ps.AddParameter("s", 10);



            ps.AddCommand("Start-VM");
            ps.AddArgument(vm.vmName);
            ps.AddCommand("Start-Sleep");
            ps.AddParameter("m", 500);
            ps.Invoke();
            await Task.Delay(timeDelay * 1000);

        }

    }

这个问题到底是什么? - DavidG
那仍然不是一个问题。如果您有更多信息,请编辑您的问题。注释中的代码无法阅读。 - DavidG
从停止虚拟机命令中,没有抛出任何错误,注释代码中的重新启动命令序列确实有效。然而,我想使用停止虚拟机命令中的序列。 - user5930979
“Stop-VM” 命令不需要一个“-name”参数吗?比如说“Stop-VM -name SomeComputer”? - DavidG
是的,但不应该是 AddParameter("Name", vm.vmName) 吗? - DavidG
显示剩余2条评论
1个回答

2

如果您仍需要答案:

using (PowerShell shell = PowerShell.Create())

开始前

shell.AddScript("Invoke-Command -ComputerName "name of your target PC" -ScriptBlock {Stop-VM " + VM.getname() + "}");

停止虚拟机并等待结果

shell.AddScript("Invoke-Command -ComputerName "name of your target PC" -ScriptBlock {Start-VM " + VM.getname() + "}");

启动虚拟机并等待结果

foreach (PSObject outputItem in shell.Invoke())
{
    string name = outputItem.Members["Name"].Value.ToString()
}

遍历所有机器并返回你的机器名称到字符串“name”中,但它可以返回引擎的任何参数。(在这种情况下,字符串只会有最后一个机器的名称,因为它不断被重写,但用包含对象替换它应该不成问题。)

shell.Streams.Error
shell.Streams.Warning

返回所有 PowerShell 的问题。

希望这有所帮助。

PS:确保您拥有最新的 PowerShell,因为许多系统使用的是旧版本,不支持所有命令。也许有一个重启命令,但我不知道,由于我无法在我的位置测试它,您需要自己找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接