Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Команды с ВМ Hyper-V из PowerShell  (Прочитано 1747 раз)
0 Пользователей и 1 Гость смотрят эту тему.
GrabbeR
Новенький

pl
Offline Offline

« : 09-10-2024 21:32 » new

Доброго времени суток, ув. форумчане!

Delphi 11 Update 3

Имеется рабочая процедура вывода результата выполнения консольной команды из PowerShell (отрисовка консоли) в RichEdit.
Задача: выполнить приостановку/запуск нескольких ВМ на Hyper-V при условии проверки их статуса:
- если статус "Running" - приостановить;
- если статус "Paused" - запустить.

Прошу помощи. Возможно, реализуемо через WMI, например? У кого есть наработки, поделитесь, пожалуйста.

Процедура:
Код:
procedure RunDosInMemo(CmdLine: widestring; AMemo: TRichEdit);
const
  ReadBuffer = 2400;
var
  sa: PAnsiChar;
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PAnsiChar;
  BytesRead: DWord;
  Apprunning: DWord;
begin
  Screen.Cursor := CrHourGlass;
 
  with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
  if Createpipe(ReadPipe, WritePipe,
    @Security, 0) then
  begin
    Buffer := AllocMem(ReadBuffer + 1);
    FillChar(Start, Sizeof(Start), #0);
    start.cb := SizeOf(start);
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
    // start.dwFlags := STARTF_USESHOWWINDOW;
    start.dwFlags := STARTF_USESTDHANDLES +
      STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;
 
    if CreateProcess(nil,
      PChar(CmdLine),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo) then
    begin
      repeat
        Apprunning := WaitForSingleObject
          (ProcessInfo.hProcess, 100);
        ReadFile(ReadPipe, Buffer[0],
          ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
 
        sa := PAnsiChar(Buffer);
        OemToCharA(sa, sa);
        AMemo.Text := AMemo.text + sa;
 
        Application.ProcessMessages;
      until (Apprunning <> WAIT_TIMEOUT);
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
  Screen.Cursor := CrDefault;
end;

Вызов:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Clear;
  RunDosInMemo('powershell.exe' + ' /c ' + 'Get-VM -Name S2.ACPA.16,S2.W2022.Test | Format-Table -HideTableHeaders State', RichEdit1);
end;

Листинг PowerShell:
Код:
PS C:\Windows\system32> Get-VM -Name S2.ACPA.16,S2.W2022.Test | Format-Table -HideTableHeaders State
 
Running
Running
 
 
PS C:\Windows\system32> Suspend-VM -Name S2.ACPA.16,S2.W2022.Test -Verbose -Confirm:$false
ПОДРОБНО: Suspend-VM приостановит работу виртуальной машины "S2.W2022.Test".
ПОДРОБНО: Suspend-VM приостановит работу виртуальной машины "S2.ACPA.16".
PS C:\Windows\system32> Get-VM -Name S2.ACPA.16,S2.W2022.Test | Format-Table -HideTableHeaders State
 
Paused
Paused
 
 
PS C:\Windows\system32> Resume-VM -Name S2.ACPA.16,S2.W2022.Test -Verbose -Confirm:$false
ПОДРОБНО: Resume-VM возобновит работу виртуальной машины "S2.W2022.Test".
ПОДРОБНО: Resume-VM возобновит работу виртуальной машины "S2.ACPA.16".
PS C:\Windows\system32> Get-VM -Name S2.ACPA.16,S2.W2022.Test | Format-Table -HideTableHeaders State
 
Running
Running

* Screenshot-130.png (31.33 Кб - загружено 47 раз.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines