使用 C# 中的 powershell cmdlet 重启 Hyper V 机器
Restart Hyper V machine using powershell cmdlet from C#
我正在尝试构建一个应用程序以在 Server 2012 的 Hyper V 中重启虚拟机
我让列表中的每个 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);
}
}
以防万一您还需要答案:
using (PowerShell shell = PowerShell.Create())
开始之前
shell.AddScript("Invoke-Command -ComputerName "name of your target PC" -ScriptBlock {Stop-VM " + VM.getname() + "}");
停止 VM 并等待结果
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()
}
遍历所有机器和 returns 在这种情况下将您的机器名称转换为字符串名称,但它可以 return 引擎的每个参数。 (在这种情况下,字符串将只有最后一台机器的名称,因为它会不断被重写,但用您的包含对象替换它应该没问题。)
shell.Streams.Error
shell.Streams.Warning
return从 powershell 解决所有问题。
希望对您有所帮助。
PS:确保你有一个最新的 powershell,因为许多系统都有旧的,不支持所有的命令,也可能有一个重启命令,但我不我不知道,因为我不能在我所在的地方测试它,你需要自己找到它。
我正在尝试构建一个应用程序以在 Server 2012 的 Hyper V 中重启虚拟机 我让列表中的每个 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);
}
}
以防万一您还需要答案:
using (PowerShell shell = PowerShell.Create())
开始之前
shell.AddScript("Invoke-Command -ComputerName "name of your target PC" -ScriptBlock {Stop-VM " + VM.getname() + "}");
停止 VM 并等待结果
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()
}
遍历所有机器和 returns 在这种情况下将您的机器名称转换为字符串名称,但它可以 return 引擎的每个参数。 (在这种情况下,字符串将只有最后一台机器的名称,因为它会不断被重写,但用您的包含对象替换它应该没问题。)
shell.Streams.Error
shell.Streams.Warning
return从 powershell 解决所有问题。
希望对您有所帮助。
PS:确保你有一个最新的 powershell,因为许多系统都有旧的,不支持所有的命令,也可能有一个重启命令,但我不我不知道,因为我不能在我所在的地方测试它,你需要自己找到它。