Создание графического интерфейса PowerShell (часть 13)

Опубликовано: 17 Марта, 2023

  • Создание графического интерфейса PowerShell (часть 12)

В моей предыдущей статье из этой серии я показал вам, как создать кнопку-переключатель, которую можно использовать для включения и выключения виртуальной машины. Эта кнопка даже изменила цвет, чтобы отразить состояние виртуальной машины. В этой статье я хочу завершить серию, показав вам, как создать графический интерфейс, который можно использовать для изменения распределения памяти виртуальной машины.

Интерфейс GUI уже отображает объем памяти, который в настоящее время использует виртуальная машина, но это может не всегда совпадать с распределением памяти. Например, виртуальная машина, которой было выделено 4 ГБ памяти, покажет, что используется 0 ГБ памяти, если виртуальная машина выключена.

Чтобы изменить выделение памяти виртуальной машине из графического интерфейса, нам нужно сделать несколько вещей. Во-первых, нам нужно создать текстовое поле, которое может отображать выделение памяти. Мы будем использовать это же текстовое поле для внесения изменений.

Нам также понадобится элемент управления, который можно использовать для отправки изменений распределения памяти. Как вы помните, графический интерфейс уже содержит кнопку, зарезервированную для использования в будущем. Я буду использовать эту кнопку в качестве кнопки отправки.

Наконец, нам понадобится код, который принимает значение, отправленное через форму, и соответствующим образом настраивает память виртуальной машины.

Итак, давайте продолжим и начнем с создания текстового поля и заполнения его текущим объемом памяти. Чтобы все было красиво и аккуратно, я также собираюсь создать еще один ярлык и использовать его для отражения того, что я делаю. Вот код для дополнительной метки и для текстового поля:

# Define Label8 – Текст выделения памяти
$Label8 = Новый объект System.Windows.Forms.Label
$Label8.AutoSize = $False
$Label8.Location = новый объект System.Drawing.Size(50,160)
$Label8.Size = Новый объект System.Drawing.Size(200,20)
$Label8.ForeColor = «Черный»
$Label8.Text = «Выделение памяти (МБ)»

$Global:TextBox = Новый объект System.Windows.Forms.TextBox
$Global:TextBox.Location = Новый объект System.Drawing.Size(50 180)
$Global:TextBox.Size = Новый объект System.Drawing.Size(200,20)

Кроме того, я добавил немного кода в свой сценарий, чтобы добавить новые объекты метки и текстового поля на дисплей (и удалить эти объекты с экрана), когда это необходимо. Я предоставлю вам полный сценарий в конце этой статьи.

Итак, следующее, что нам нужно сделать, это заполнить текстовое поле объемом памяти, выделенным для текущей выбранной виртуальной машины. Как вы помните из предыдущей статьи, функция Display-VMInfo содержит раздел, в котором я создаю переменные для хранения всех фрагментов данных, которые необходимо отобразить для выбранной виртуальной машины. Я собираюсь добавить новую переменную с именем $MemoryStart к этому

раздел,

и установите его равным свойству $MemoryStartup для выбранной виртуальной машины. Вот как выглядит блок кода:

# Получить информацию о виртуальной машине
$SelectedVM = Get-VM $ChosenItem
$Global:Name = $SelectedVM.VMName
$State = $SelectedVM.State
$RunTime = $SelectedVM.UpTime
$Memory = $SelectedVM.MemoryAssigned
$CPU = $SelectedVM.ProcessorCount
$MemoryStart = ($SelectedVM.MemoryStartup / 1 МБ)

Обратите внимание, что я говорю PowerShell выражать загрузочную память в мегабайтах, чтобы не иметь дело с большими строками байтов. Этот метод обеспечивает более чистый результат.

Кроме того, мне нужно отобразить содержимое переменной $MemoryStartup в текстовом поле, поэтому я собираюсь добавить строку в раздел функции #Create Text. Вот как сейчас выглядит раздел:

#Создать текст
$Label.Text = 'Имя виртуальной машины: ' + $Name
$Label4.Text = 'Состояние ВМ: ' + $State
$Label5.Text = 'Время работы ВМ: ' + $RunTime
$Label6.Text = 'Выделенная память: ' + $Memory
$Label7.Text = 'Назначенные виртуальные процессоры:' + $CPU
$Global:TextBox.Text = $MemoryStart

На рисунке ниже показано, как теперь выглядит интерфейс GUI. Как видите, загрузочная память виртуальной машины теперь отображается в текстовом поле. Мы можем даже напечатать отображаемое значение, но прямо сейчас это не будет иметь никакого эффекта. Если мы хотим разрешить изменение памяти из графического интерфейса, нам нужно немного поработать над кнопкой «Зарезервировано для будущего использования».

Вот как на данный момент выглядит графический интерфейс.

Есть две вещи, которые нам нужно сделать с кнопкой «Зарезервировано для будущего использования», чтобы сделать ее функциональной. Во-первых, мы должны изменить текст кнопки на что-то более описательное. Во-вторых, нам нужно будет изменить действие нажатия кнопки. Здесь все становится немного сложнее. Вот код кнопки:

# Define Button 4 – Эта кнопка пока ничего не делает, но мы будем использовать ее в конечном итоге.
$Button4 = Новый объект System.Windows.Forms.Button
$Button4.Location = Новый объект System.Drawing.Size(140,220)
$Button4.Size = Новый объект System.Drawing.Size(150,30)
$Button4.BackColor = «Светло-серый»
$Button4.Text = «Установить загрузочную память»
$Button4.Add_Click({$MemoryStart = $TextBox.Text
$CmdStr = «Set-VMMemory» + $Name + «-StartupBytes» + $MemoryStart + «MB»
Вызов-выражение $CmdStr
Display-VMInfo $Name})

Как вы можете видеть в блоке кода выше, изменить текст кнопки очень просто. Тем не менее, мы делаем что-то немного другое с действием щелчка, чем то, что было сделано ранее в этой серии. Вместо выполнения одной команды или вызова функции мы выполняем несколько команд.

Первая из этих команд принимает любое значение, отображаемое в данный момент в текстовом поле, и присваивает его переменной $MemoryStart.

Вторая команда создает переменную с именем $CmdStr. В этой переменной будет храниться текст, который составит команду на изменение памяти виртуальной машины. По сути, мы выполняем манипуляции со строками, чтобы создать команду.

Третья команда использует командлет Invoke-Expression для выполнения содержимого переменной $CmdStr. Это строка кода, которая фактически вызывает изменение памяти виртуальной машины.

Последний вызов просто вызывает функцию Display-VMInfo. Это упрощает обновление дисплея.

Вы можете увидеть окончательный результат на рисунке ниже.

Вот как финальный сценарий выглядит в действии.

Как и обещал, вот весь код скрипта:

#Загрузить сборки
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
$net = New-Object -ComObject Wscript.Network

# Показать главный экран
Функция Display-MainScreen
{
$ Форма. Элементы управления. Добавить ($ ListBox1)
$Форма.Управление.Добавить($Кнопка1)
$Форма.Элементы.Добавить($Кнопка2)
$ Форма. Элементы управления. Добавить ($ Метка2)
}

# ———- Действия по нажатию кнопки ——

#Определить функцию нажатия кнопки возврата
Функция Return-MainScreen
{

$ Форма. Элементы управления. Удалить ($ Метка)
$ Форма. Элементы управления. Удалить ($ Метка3)
$ Форма. Элементы управления. Удалить ($ Метка4)
$ Форма. Элементы управления. Удалить ($ Метка5)
$Form.Controls.Remove($Label6)
$ Форма. Элементы управления. Удалить ($ Метка7)
$Form.Controls.Remove($Label8)
$ Форма. Элементы управления. Удалить ($ TextBox)
$Форма.Управление.Удалить($Кнопка3)
$Форма.Управление.Удалить($Кнопка4)
$Форма.Управление.Удалить($Кнопка5)
$ Форма. Элементы управления. Удалить ($ Кнопка 6)
$Форма.Обновить()
Display-MainScreen
}

#Определить функцию нажатия кнопки OK
Функция Display-VMInfo ($ ChosenItem)
{

#Очистить окно
$ Форма. Элементы управления. Удалить ($ ListBox1)
$ Форма. Элементы управления. Удалить ($ Метка2)
$Форма.Управление.Удалить($Кнопка1)
$Форма.Управление.Удалить($Кнопка2)
$Форма.Управление.Удалить($Кнопка5)
$Форма.Управление.Удалить($Кнопка6)
$Форма.Обновить()

#Создать вывод
Add-Type -AssemblyName System.Windows.Forms

# Получить информацию о виртуальной машине

$SelectedVM = Get-VM $ChosenItem
$Global:Name = $SelectedVM.VMName
$State = $SelectedVM.State
$RunTime = $SelectedVM.UpTime
$Memory = $SelectedVM.MemoryAssigned
$CPU = $SelectedVM.ProcessorCount
$MemoryStart = ($SelectedVM.MemoryStartup / 1 МБ)

#Создать текст
$Label.Text = 'Имя виртуальной машины: ' + $Name
$Label4.Text = 'Состояние ВМ: ' + $State
$Label5.Text = 'Время работы ВМ: ' + $RunTime
$Label6.Text = 'Выделенная память: ' + $Memory
$Label7.Text = 'Назначенные виртуальные процессоры:' + $CPU
$Global:TextBox.Text = $MemoryStart

#Показать содержимое экрана
$Form.Controls.Add($Label)
$ Форма. Элементы управления. Добавить ($ Метка4)
$ Форма. Элементы управления. Добавить ($ Метка5)
$ Форма. Элементы управления. Добавить ($ Метка6)
$ Форма. Элементы управления. Добавить ($ Метка7)
$ Форма. Элементы управления. Добавить ($ Метка3)
$Форма.Управление.Добавить($Кнопка3)
$Форма.Управление.Добавить($Кнопка4)
$ Форма. Элементы управления. Добавить ($ Метка8)
$ Форма. Элементы управления. Добавить ($ Текстовое поле)

Если ($State -eq 'Выкл')
{
$Форма.Управление.Добавить($Кнопка5)
}
Если ($State -EQ 'Выполняется')
{
$Форма.Управление.Добавить($Кнопка6)
}
}

#—— Определить все объекты GUI——-

# Define Label — это объект текстового поля, в котором будет отображаться имя виртуальной машины.
$Label = Новый объект System.Windows.Forms.Label
$Label.AutoSize = $False
$Label.Location = новый объект System.Drawing.Size(50,50)
$Label.Size = Новый объект System.Drawing.Size(200,20)
$Label.ForeColor = «Черный»
$label.BackColor = 'Белый'

# Define Label2 – текст «Пожалуйста, сделайте выбор»
$Label2 = Новый объект System.Windows.Forms.Label
$Label2.AutoSize = $Истина
$Label2.Location = новый объект System.Drawing.Size(20,50)
$Label2.ForeColor = «Темно-синий»
$Label2.Text = «Выберите виртуальную машину из списка».

# Определить Label3 — текст «Это выбранная вами виртуальная машина»
$Label3 = Новый объект System.Windows.Forms.Label
$Label3.AutoSize = $Истина
$Label3.Location = новый объект System.Drawing.Size(50,30)
$Label3.ForeColor = «Темно-синий»
$Label3.Text = "Выбранная вами виртуальная машина:"

# Define Label4 — метка «Это состояние виртуальной машины»
$Label4 = Новый объект System.Windows.Forms.Label
$Label4.AutoSize = $False
$Label4.Location = новый объект System.Drawing.Size(50,70)
$Label4.Size = Новый объект System.Drawing.Size(200,20)
$Label4.ForeColor = «Черный»
$Label4.BackColor = 'Белый'

# Определить Label5 — это время работы виртуальной машины
$Label5 = Новый объект System.Windows.Forms.Label
$Label5.AutoSize = $False
$Label5.Location = новый объект System.Drawing.Size(50,90)
$Label5.Size = Новый объект System.Drawing.Size(200,20)
$Label5.ForeColor = «Черный»
$Label5.BackColor = «Белый»

# Define Label6 — это память виртуальной машины, назначенная
$Label6 = Новый объект System.Windows.Forms.Label
$Label6.AutoSize = $False
$Label6.Location = новый объект System.Drawing.Size(50,110)
$Label6.Size = Новый объект System.Drawing.Size(200,20)
$Label6.ForeColor = «Черный»
$Label6.BackColor = 'Белый'

# Define Label7 — Это назначенные виртуальные ЦП ВМ
$Label7 = Новый объект System.Windows.Forms.Label
$Label7.AutoSize = $False
$Label7.Location = новый объект System.Drawing.Size(50,130)
$Label7.Size = Новый объект System.Drawing.Size(200,20)
$Label7.ForeColor = «Черный»
$Label7.BackColor = 'Белый'

# Define Label8 – Текст выделения памяти
$Label8 = Новый объект System.Windows.Forms.Label
$Label8.AutoSize = $False
$Label8.Location = новый объект System.Drawing.Size(50,160)
$Label8.Size = Новый объект System.Drawing.Size(200,20)
$Label8.ForeColor = «Черный»
$Label8.Text = «Выделение памяти (МБ)»

$Global:TextBox = Новый объект System.Windows.Forms.TextBox
$Global:TextBox.Location = Новый объект System.Drawing.Size(50 180)
$Global:TextBox.Size = Новый объект System.Drawing.Size(200,20)

# Define List Box — здесь будут отображаться виртуальные машины, которые можно выбрать
$ListBox1 = Новый объект System.Windows.Forms.ListBox
$ListBox1.Location = Новый объект System.Drawing.Size(20,80)
$ListBox1.Size = Новый объект System.Drawing.Size(260,20)
$ListBox1.Height = 80

# Этот код заполняет поле списка именами виртуальных машин
$VirtualMachines = Get-VM
ForEach ($VM в $VirtualMachines)
{
[пусто] $ListBox1.Items.Add($VM.Name)
}

# Define Button 1 – это кнопка OK на экране выбора.
$Button1 = новый объект System.Windows.Forms.Button
$Button1.Location = новый объект System.Drawing.Size(20 170)
$Button1.Size = новый объект System.Drawing.Size(70,30)
$Button1.BackColor = «Светло-серый»
$Button1.Text = «ОК»
$Button1.Add_Click({$ChosenItem=$ListBox1.SelectedItem;Display-VMInfo $ChosenItem})

# Кнопка «Определить 2» — это кнопка «Отмена» на экране выбора.
$Button2 = Новый объект System.Windows.Forms.Button
$Button2.Location = Новый объект System.Drawing.Size(120,170)
$Button2.Size = Новый объект System.Drawing.Size(70,30)
$Button2.BackColor = «Светло-серый»
$Button2.Text = «Отмена»
$Button2.Add_Click({$Form.Close()})

# Define Button 3 — это кнопка возврата на главный экран.
$Button3 = Новый объект System.Windows.Forms.Button
$Button3.Location = Новый объект System.Drawing.Size(50 220)
$Button3.Size = Новый объект System.Drawing.Size(70,30)
$Button3.BackColor = «Светло-серый»
$Button3.Text = «Возврат»
$Button3.Add_Click({Return-MainScreen})

# Define Button 4 – Эта кнопка пока ничего не делает, но мы будем ее использовать в конце концов.
$Button4 = Новый объект System.Windows.Forms.Button
$Button4.Location = Новый объект System.Drawing.Size(140,220)
$Button4.Size = Новый объект System.Drawing.Size(150,30)
$Button4.BackColor = «Светло-серый»
$Button4.Text = «Установить загрузочную память»
$Button4.Add_Click({$MemoryStart = $TextBox.Text
$CmdStr = «Set-VMMemory» + $Name + «-StartupBytes» + $MemoryStart + «MB»
Вызов-выражение $CmdStr
Display-VMInfo $Name})

# Define Button 5 — эта кнопка будет использоваться для запуска виртуальной машины.
$Button5 = Новый объект System.Windows.Forms.Button
$Button5.Location = Новый объект System.Drawing.Size(140 260)
$Button5.Size = Новый объект System.Drawing.Size(150,30)
$Button5.BackColor = «Зеленый»
$Button5.ForeColor = «Белый»
$Button5.Text = «Запустить виртуальную машину»
$Button5.Add_Click({Start-VM $Name | Display-VMInfo $Name})

# Define Button 6 — Эта кнопка выключает виртуальную машину.
$Button6 = Новый объект System.Windows.Forms.Button
$Button6.Location = Новый объект System.Drawing.Size(140 260)
$Button6.Size = Новый объект System.Drawing.Size(150,30)
$Button6.BackColor = «Красный»
$Button6.ForeColor = «Белый»
$Button6.Text = «Остановить ВМ»
$Button6.Add_Click({Stop-VM $Name -Force | Display-VMInfo $Name})

# ——— Это конец раздела определения объекта ——

# ——Нарисуйте пустую форму—-
$Form = Новый объект System.Windows.Forms.Form
$Форма.ширина = 525
$Форма.высота = 350
$Form.BackColor = «голубой»
$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D
$Form.Text = «Виртуальные машины Hyper-V»
$Form.maximumsize = Новый объект System.Drawing.Size(525 350)
$Form.startposition = «центральный экран»
$Form.KeyPreview = $Истина
$Form.Add_KeyDown({if ($_.KeyCode -eq "Enter") {}})
$Form.Add_KeyDown({if ($_.KeyCode -eq «Escape»)
{$Форма.Закрыть()}})

#—-Заполнить форму—-
Display-MainScreen
$Form.Add_Shown({$Form.Activate()})
$Форма.ШоуДиалог()

Вывод

В этой серии статей я продемонстрировал множество различных элементов управления графического интерфейса, которые можно использовать в PowerShell. Как показано в этой статье, вы можете использовать эти элементы управления для взаимодействия с операционной системой Windows.