|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Команды с ВМ Hyper-V из PowerShell
Доброго времени суток, ув. форумчане!
Delphi 11 Update 3 Имеется рабочая функция вывода результата выполнения консольной команды из PowerShell (отрисовка консоли) в RichEdit. Задача: выполнить приостановку/запуск нескольких ВМ на Hyper-V при условии проверки их статуса: - если статус "Running" - приостановить; - если статус "Paused" - запустить. Прошу помощи. Возможно, реализуемо через WMI, например? У кого есть наработки, поделитесь, пожалуйста. Функция: Код:
... uses ShellAPI; ... 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 |