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

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

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

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

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

Это код, используемый для создания списка. Как и все другие элементы графического интерфейса, с которыми мы работали, список является объектом. Таким образом, мы можем определить поле со списком точно так же, как мы определяем любой другой объект (с помощью командлета New-Object). Как и в случае с другими объектами, с которыми мы работали, мы также определяем размер и местоположение. Единственное, что действительно отличается от того, что мы делаем как часть определения объекта, — это определение высоты списка. Высота определяет размер списка и, следовательно, количество отображаемых элементов без необходимости прокрутки.

Нижняя часть показанного выше кода добавляет элементы в список. В данном случае я позаимствовал код из действия по нажатию кнопки, которое настроил в предыдущей статье. Я получаю список виртуальных машин и присваиваю его переменной с именем $VirtualMachines. Затем я настраиваю цикл ForEach, в котором я выполняю действие для каждой виртуальной машины ($VM) в списке виртуальных машин ($VirtualMachines). Действие, которое я выполняю, заключается в добавлении имени виртуальной машины в список.

И последнее, что нам нужно сделать, это добавить поле со списком в графический интерфейс. Как и в случае с другими объектами, мы можем сделать это, используя $Form.Controls.Add, за которым следует имя списка ($ListBox1). Вот настоящая команда:

Я покажу вам полный сценарий позже в этой статье, но сейчас вот как выглядит окно со списком:

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

Итак, мы создали список, содержащий имена всех виртуальных машин на сервере. Можно щелкнуть имя виртуальной машины и нажать кнопку OK. Однако на данный момент действие щелчка осталось еще до того, как я создал список. На самом деле кнопка не обращает внимания на существование списка. Итак, теперь возникает вопрос, как мы можем основывать действие щелчка на выбранном элементе?

Вот исходная строка кода, определяющая поведение кнопки при нажатии:

Я собираюсь заменить эту строку кода на эту:

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

Вы также заметите точку с запятой после SelectedItem. Эта точка с запятой представляет собой начало новой команды. Это команда Display-VMInfo $ChosenItem. Display-VMInfo — это имя созданной мной функции, и я передаю этой функции переменную $ChosenItem.

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

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

Изображение 4604
Предыдущая версия скрипта отображала список виртуальных машин в ответ на нажатие кнопки.

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

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

Как видите, вы можете использовать $Form.Controls.Remove, за которым следует имя объекта, чтобы удалить объект из окна. В конце этого блока кода я использовал $Form.Refresh() для обновления графического интерфейса. Честно говоря, команда «Обновить», вероятно, не нужна, но я включил ее, потому что в некоторых старых версиях PowerShell возникают проблемы с удалением графических элементов, если вы не обновляете экран.

Итак, с учетом сказанного, вот сценарий целиком:

На данный момент запуск скрипта отображает список с именами виртуальных машин, которые существуют на сервере, как показано ниже:

Изображение 4605
Выберите виртуальную машину и нажмите OK.

После выбора экран очищается, а имя выбранной виртуальной машины отображается в текстовом поле, как показано ниже:

Изображение 4606
Отображается имя выбранной ВМ.

Вывод

Теперь, когда я показал вам, как создать окно со списком и как удалить элементы из интерфейса GUI, я планирую вывести на экран некоторую полезную информацию. Я также покажу вам, как немного навести порядок, добавив заголовок над текстовым полем вывода и добавив кнопку «Отмена».