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

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

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

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

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

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

#Определить функцию нажатия кнопки

Функция DisplayVM

{

$VirtualMachines = Get-VM

Add-Type -AssemblyName System.Windows.Forms

#Создать текст

$Label = Новый объект System.Windows.Forms.Label

$Label.AutoSize = $Истина

ForEach ($vm в $VirtualMachines){

$NL = «n»

$Label.Text = $Label.Text + $VM.Name + $NL

}

$Label.Location = новый объект System.Drawing.Size(88,73)

$Form.Controls.Add($Label)

}

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

Еще одна вещь, которую я сделал, это создать цикл ForEach. Этот цикл позволяет мне работать с массивом (списком) виртуальных машин и перечислять каждую виртуальную машину одну за другой. Поэтому для каждой виртуальной машины ($vm) в списке виртуальных машин ($VirtualMachines) я добавляю имя виртуальной машины ($VM.Name) к метке ($Label.Text).

Вы также заметите, что я создал переменную с именем $NL и добавил содержимое этой переменной к имени виртуальной машины. Переменная $NL используется для вставки перевода строки. Таким образом, каждая виртуальная машина будет указана с новой строки. Сама переменная содержит текст: `n. Это код «новой строки» PowerShell. При использовании этого кода будьте осторожны, чтобы использовать правильный символ. Символ ` не является апострофом. Это символ, который имеет общую клавишу клавиатуры с символом ~.

Таким образом, на рисунке А показано, как выглядит вывод после нажатия кнопки.

Изображение 4625
Рисунок A. Я показываю полный список виртуальных машин.

Хорошо, вывод выполнил то, что мне было нужно, но давайте немного почистим. Давайте добавим блок текста, говорящий тому, кто использует скрипт, что произойдет, когда он нажмет кнопку. Давайте также переместим кнопку и выводимый текст и назовем кнопку не Button. Наконец, давайте изменим имя окна на что-нибудь другое, кроме Hello World.

Это звучит как много работы, но на самом деле это довольно просто сделать. Начнем с добавления второго блока текста. Для этого я создал переменную с именем $Label2, а затем использовал строку кода ($Form.Controls.Add($Label2)) для отображения метки. Сама метка была создана с использованием четырех строк кода, которые очень похожи на те, что используются для метки1, за исключением того, что они отображают статический текст. Вот эти несколько строк кода:

# Создать метку2

$Label2 = Новый объект System.Windows.Forms.Label

$Label2.AutoSize = $Истина

$Label2.Location = новый объект System.Drawing.Size(20,50)

$Label2.Text = «Нажмите кнопку, чтобы просмотреть список виртуальных машин, размещенных на сервере».

Взглянув на приведенный выше блок кода, вы заметите строку, начинающуюся с $Label2.Location. Числа, используемые в конце этой строки, представляют собой координаты X/Y, которые определяют, где текст метки будет отображаться в диалоговом окне. В этом случае текст отображается на 20 пикселей вправо и на 50 пикселей вниз от верхнего левого угла диалогового окна. Я использовал почти идентичные строки кода для перемещения текста $Label1 и кнопки.

Между прочим, изменение имени кнопки и изменение имени окна сводилось к замене статического текста. Имя кнопки определяется переменной $Button1.Text, а имя окна — переменной $Form.Text.

Вот полный скрипт:

#Загрузить сборки

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null

$net = New-Object -ComObject Wscript.Network

#Определить функцию нажатия кнопки

Функция DisplayVM

{

$VirtualMachines = Get-VM

Add-Type -AssemblyName System.Windows.Forms

#Создать текст

$Label = Новый объект System.Windows.Forms.Label

$Label.AutoSize = $Истина

Foreach ($vm в $VirtualMachines){

$NL = «n»

$Label.Text = $Label.Text + $VM.Name + $NL

}

$Label.Location = новый объект System.Drawing.Size(200,110)

$Form.Controls.Add($Label)

}

#Нарисовать форму

$Form = Новый объект System.Windows.Forms.Form

$Форма.ширина = 525

$Форма.высота = 350

$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»)

{$Форма.Закрыть()}})

# Создать метку2

$Label2 = Новый объект System.Windows.Forms.Label

$Label2.AutoSize = $Истина

$Label2.Location = новый объект System.Drawing.Size(20,50)

$Label2.Text = «Нажмите кнопку, чтобы просмотреть список виртуальных машин, размещенных на сервере».

#Создать кнопку

$Button1 = новый объект System.Windows.Forms.Button

$Button1.Location = новый объект System.Drawing.Size(30,70)

$Button1.Size = новый объект System.Drawing.Size(80,20)

$Button1.Text = «ОК»

$Button1.Add_Click({DisplayVM})

#Создать форму

$Форма.Управление.Добавить($Кнопка1)

$ Форма. Элементы управления. Добавить ($ Метка2)

$Form.Add_Shown({$Form.Activate()})

$Форма.ШоуДиалог()

Вот вывод исправленного скрипта после нажатия кнопки.

Изображение 4626
Рисунок B: Вывод скрипта очищен.

Вывод

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

Второй вывод заключается в том, что в графическом интерфейсе PowerShell положение каждого элемента контролируется индивидуально с помощью координат X/Y. Вы можете перемещать кнопки, метки и другие объекты в любое удобное для вас положение, просто меняя координаты.

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

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