Доброго времени суток, ув. форумчане!
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