Перезапустите машину Hyper V с помощью командлета powershell из С#.

Я пытаюсь создать приложение для перезапуска виртуальных машин в Hyper V на сервере 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);

        }

    }

person Community    schedule 08.08.2016    source источник
comment
В чем именно вопрос?   -  person DavidG    schedule 09.08.2016
comment
Это еще не вопрос. и если у вас есть дополнительная информация, отредактируйте свой вопрос. Код в комментариях не читается.   -  person DavidG    schedule 09.08.2016
comment
из команды Stop vm никаких ошибок не выдается, последовательность команд resart в закомментированном коде работает. однако я хочу использовать последовательность из команды stop vm cmd   -  person    schedule 09.08.2016
comment
Разве команде Stop-VM не нужен аргумент -name? Что-то вроде Stop-VM -name SomeComputer?   -  person DavidG    schedule 09.08.2016
comment
Аргумент задается AddArguement(vm.vmName)   -  person    schedule 09.08.2016
comment
Да, но разве это не должно быть AddParameter("Name", vm.vmName)?   -  person DavidG    schedule 09.08.2016
comment
Кажется, это работает в закомментированном коде перезапуска   -  person    schedule 09.08.2016


Ответы (1)


На всякий случай, если вам все еще нужен ответ:

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

Проходит через все машины и возвращает в этом случае имя вашей машины в строковое имя, но может возвращать любой параметр движка. (в этом случае строка будет иметь только имя последней машины, потому что она постоянно перезаписывается, но не должно возникнуть проблем с заменой ее содержащим объектом.)

shell.Streams.Error
shell.Streams.Warning

возврат всех проблем из powershell.

Надеюсь, это поможет.

PS: убедитесь, что у вас есть обновленная версия powershell, так как многие системы имеют более старые версии, которые не поддерживают все команды. Также, возможно, есть команда перезапуска, но я не знаю, и поскольку я не могу проверить там, где я, вы должны найти это для себя.

person Etaila    schedule 21.12.2016