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

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

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

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

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

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

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

Первый ответ заключается в том, что вы можете передать текст переменной, а затем присвоить этой переменной метку. На самом деле, я уже сделал это. Помните, что мой сценарий позволяет вам выбрать виртуальную машину из списка, а затем отображает имя выбранной виртуальной машины. Для этого мне пришлось поместить имя виртуальной машины в переменную, а затем присвоить этой переменной метку. Как вы можете видеть в блоке кода ниже, я заполнил текст метки непосредственно перед отображением метки:

$Label.Text = $ВыбранныйЭлемент
$Form.Controls.Add($Label)

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

Другая часть ответа на вопрос, почему я не использую один ярлык, заключается в том, что я не могу. Помните, что метка — это объект, который мы помещаем на экран. Когда мы очищаем экран, нам фактически нужно указать PowerShell удалить объект. Следовательно, мы можем изменить текст метки, но мы не можем использовать одну метку для одновременного отображения на экране нескольких различных независимых блоков текста.

Итак, вернемся к обсуждаемой теме. Чтобы адаптировать мой скрипт для отображения информации о виртуальной машине, мне пришлось внести несколько изменений. Первое изменение, которое я сделал, касалось объекта $Label. Первоначально этот объект был текстовым полем, но я изменил его на стандартную метку. Конечно, я мог бы отобразить информацию о виртуальной машине в текстовом поле, но я планирую в конечном итоге сделать сценарий более интерактивным, и это изменение закладывает основу для того, что я буду делать позже.

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

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

# 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 = 'Белый'

Когда базовая структура меток была создана, отображать информацию о ВМ стало проще. Как вы помните, у меня есть переменная с именем $ChosenItem, которая содержит имя виртуальной машины. Поэтому я создал еще одну переменную с именем $SelectedVM, в которой хранятся все атрибуты, связанные с указанной виртуальной машиной, с помощью команды Get-VM. Затем я настроил ряд других переменных для хранения отдельных атрибутов виртуальной машины, а затем добавил эти переменные для обозначения текста. Вот как выглядит блок кода:

# Получить информацию о виртуальной машине
$SelectedVM = Get-VM $ChosenItem
$Name = $SelectedVM.VMName
$State = $SelectedVM.State
$RunTime = $SelectedVM.UpTime
$Memory = $SelectedVM.MemoryAssigned
$CPU = $SelectedVM.ProcessorCount
#Создать текст
$Label.Text = 'Имя виртуальной машины: ' + $Name
$Label4.Text = 'Состояние ВМ: ' + $State
$Label5.Text = 'Время работы ВМ: ' + $RunTime
$Label6.Text = 'Выделенная память: ' + $Memory
$Label7.Text = 'Назначенные виртуальные процессоры:' + $CPU
# Отображать текст
$Form.Controls.Add($Label)
$ Форма. Элементы управления. Добавить ($ Метка4)
$ Форма. Элементы управления. Добавить ($ Метка5)
$ Форма. Элементы управления. Добавить ($ Метка6)
$ Форма. Элементы управления. Добавить ($ Метка7)
$ Форма. Элементы управления. Добавить ($ Метка3)
$Форма.Управление.Добавить($Кнопка3)
$Форма.Элементы.Добавить($Кнопка4)
}

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

Изображение 4549
На выходе теперь отображается информация о виртуальной машине.

Вот код целиком:

#Загрузить сборки
[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
{
$Форма.Элементы.Добавить($СписокBox1)
$Форма.Управление.Добавить($Кнопка1)
$Форма.Элементы.Добавить($Кнопка2)
$ Форма. Элементы управления. Добавить ($ Метка2)
}
# ---------- Действия при нажатии кнопки ------
#Определить функцию нажатия кнопки возврата
Функция Return-MainScreen
{
$ Форма. Элементы управления. Удалить ($ Метка)
$ Форма. Элементы управления. Удалить ($ Метка3)
$ Форма. Элементы управления. Удалить ($ Метка4)
$Form.Controls.Remove($Label5)
$Form.Controls.Remove($Label6)
$ Форма. Элементы управления. Удалить ($ Метка7)
$ Форма. Элементы управления. Удалить ($ Кнопка 3)
$ Форма. Элементы управления. Удалить ($ Кнопка 4)
$Форма.Обновить()
Display-MainScreen
}
#Определить функцию нажатия кнопки OK
Функция Display-VMInfo ($ ChosenItem)
{
#Очистить окно
$ Форма. Элементы управления. Удалить ($ ListBox1)
$ Форма. Элементы управления. Удалить ($ Метка2)
$Форма.Управление.Удалить($Кнопка1)
$Форма.Управление.Удалить($Кнопка2)
$Форма.Обновить()
#Создать вывод
Add-Type -AssemblyName System.Windows.Forms
# Получить информацию о виртуальной машине
$SelectedVM = Get-VM $ChosenItem
$Name = $SelectedVM.VMName
$State = $SelectedVM.State
$RunTime = $SelectedVM.UpTime
$Memory = $SelectedVM.MemoryAssigned
$CPU = $SelectedVM.ProcessorCount
#Создать текст
$Label.Text = 'Имя виртуальной машины: ' + $Name
$Label4.Text = 'Состояние ВМ: ' + $State
$Label5.Text = 'Время работы ВМ: ' + $RunTime
$Label6.Text = 'Выделенная память: ' + $Memory
$Label7.Text = 'Назначенные виртуальные процессоры:' + $CPU
# Отображать текст
$Form.Controls.Add($Label)
$ Форма. Элементы управления. Добавить ($ Метка4)
$ Форма. Элементы управления. Добавить ($ Метка5)
$ Форма. Элементы управления. Добавить ($ Метка6)
$ Форма. Элементы управления. Добавить ($ Метка7)
$ Форма. Элементы управления. Добавить ($ Метка3)
$Форма.Управление.Добавить($Кнопка3)
$Форма.Элементы.Добавить($Кнопка4)
}
#------ Определить все объекты GUI-------
# Определить метку — это объект текстового поля, который будет отображать данные виртуальной машины.
$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 = "Выберите виртуальную машину из списка."
# Define 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 = 'Белый'
# Define 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 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({$Form.Close()})
# -------- Это конец раздела определения объекта ------
# -----Нарисуйте пустую форму----
$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()})
$Форма.ШоуДиалог()

Теперь, когда скрипт отображает полезную информацию, я хочу сделать его более интерактивным. Моя цель — изменить сценарий, чтобы вы могли использовать его для запуска и остановки виртуальной машины, а также вносить изменения в объем памяти, назначенный виртуальной машине.