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

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

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

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

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

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

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

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

Вот начальный экран скрипта. Как и прежде, сценарий получает список виртуальных машин, находящихся на хосте Hyper-V, и отображает эти виртуальные машины в раскрывающемся списке. Я переставил графические элементы на этом экране, чтобы сделать его немного чище, а также добавил кнопку «Отмена». Нажатие на кнопку «Отмена» завершает работу скрипта и закрывает окно.

Как и раньше, пользователь может щелкнуть имя виртуальной машины, а затем нажать кнопку ОК. Это приведет к тому, что сценарий очистит экран, а затем отобразит имя виртуальной машины в тестовом поле. Однако вы заметите, что я добавил текстовую метку над текстовым полем с надписью «Ваша выбранная виртуальная машина». Сделано это чисто из косметических соображений. Я также добавил две кнопки. Кнопка «Возврат» возвращает пользователя к начальному экрану сценария. Другая кнопка в конечном итоге будет использоваться для чего-то, что я пока не хочу раскрывать. На данный момент нажатие кнопки «Зарезервировано для будущего использования» закрывает окно и завершает работу сценария.

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

  • Загрузка сборок
  • Функция для отображения главного экрана
  • Действия при нажатии кнопки
    • Функция нажатия кнопки возврата
    • Функция нажатия кнопки OK
  • Определить все объекты графического интерфейса
    • Определить ярлык
    • Определить метку 2
    • Определить метку 3
    • Определить список
    • Определить кнопку 1
    • Определить кнопку 2
    • Определить кнопку 3
    • Определить кнопку 4
  • Нарисуйте пустую форму
  • Заполните форму

Итак, скрипт устроен более логично, но я также упомянул, что переделал код, чтобы сделать его более легко расширяемым. На самом деле в сценарии есть два аспекта, которые просто не сработали бы, если бы код не был переработан.

Первая из них — кнопка «Возврат», показанная на предыдущем рисунке. Нажатие «Возврат» очищает дисплей и возвращает пользователя к экрану, который позволяет ему выбрать виртуальную машину. До изменения кода код, используемый для создания экрана выбора, находился в основном теле сценария, а не в функции. Перемещение этого кода в функцию позволяет вернуться на главный экран в ответ на нажатие кнопки. Когда пользователь нажимает кнопку «Возврат», скрипт вызывает функцию для отображения главного экрана. Это двухэтапный процесс. Первый шаг — очистить экран, удалив отображаемые в данный момент графические элементы. Это обрабатывается функцией Return-MainScreen, которую вы можете увидеть ниже:

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

Другим влиянием на реорганизацию кода было то, что переменная $Label ранее была определена в функции Display-VMInfo. Проблема заключалась в том, что переменная $Label была локальной для функции. Это означало, что было невозможно очистить экран до возврата к экрану выбора, потому что другие части скрипта не знали о переменной $Label и связанном с ней текстовом поле. Я мог бы решить эту проблему, определив $Label как глобальную переменную, но было бы разумнее переместить все объявления объектов GUI в один раздел кода.

Итак, с учетом сказанного, вот как выглядит код целиком:

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

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