使用c#中的powershell cmdlet重新启动Hyper V机器

本文关键字:Hyper 机器 重新启动 cmdlet 中的 powershell 使用 | 更新日期: 2023-09-27 18:01:18

我正在尝试构建一个应用程序来重启Hyper V在Server 2012中的vm我让列表中的每个VM重新启动,但我想调整它以关闭机器,然后再打开。注释的代码是有效的强制重启。提前谢谢。

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);
        }
    }

使用c#中的powershell cmdlet重新启动Hyper V机器

以防你还需要一个答案:

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为字符串Name,但它可以返回引擎的每个参数。(在这种情况下,字符串将只包含最后一台机器的名称,因为它会不断被重写,但用包含它的对象替换它应该没有问题。)

shell.Streams.Error
shell.Streams.Warning

从powershell返回所有问题。

希望对你有帮助。

PS:确保你有一个最新的powershell,因为许多系统有旧的,不支持所有的命令,也可能有一个重启命令,但我不知道,因为我不能测试它,你需要自己找到