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

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

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

До сих пор в этой серии статей я показывал вам, как создать сценарий Hello World на основе графического интерфейса в PowerShell. Затем я вернулся и добавил немного цвета и некоторые другие приятные визуальные элементы. Моей первоначальной целью в этой статье было начать создание графического интерфейса для «настоящего» сценария PowerShell. Хотя эта статья действительно начинает этот процесс, я хочу сделать большой шаг назад и подойти к процессу создания графического интерфейса совершенно по-другому. Причина, по которой я это делаю, заключается в том, что я верю, что этот метод принесет пользу большему количеству людей, чем мой предыдущий метод.

Как вы помните, мой предыдущий метод создания графического интерфейса включал использование Visual Studio для создания кода XAML, а затем обращение к этому коду из PowerShell. Этот конкретный метод работает очень хорошо. Причина, по которой я изначально выбрал этот метод, заключается в том, что мне нравится использовать Visual Studio для рисования графического интерфейса сценария, а не кодировать весь графический интерфейс вручную. Тем не менее у метода XAML есть свои недостатки. Некоторые из недостатков включают в себя:

  • Мой предыдущий метод требовал использования Visual Studio, что обычно влечет за собой затраты на лицензирование.
  • Код XAML должен храниться отдельно от кода PowerShell. Это приводит к созданию зависимостей, и сценарий PowerShell никогда не будет автономным.
  • Код XAML не следует тому же синтаксису, что и собственный код PowerShell.

Из-за этих недостатков я хотел показать вам, как вы можете воссоздать наш сценарий Hello World, используя собственный PowerShell. При этом я собираюсь структурировать код таким образом, чтобы нам было намного проще приступить к созданию «настоящего сценария».

Итак, с учетом сказанного, вот как выглядел оригинальный сценарий Hello World. Это сценарий из части 2 этой серии, до того, как я добавил цвет.

# Требуется для загрузки формы XAML и создания переменных PowerShell.

./LoadDialog.ps1 -XamlPath 'C:FormsMyForm.xaml'

#Обработчик события

$MyButton.add_Click({

$MyLabel.Content = «Привет, мир!»

})

#Запускаем окно

$xamGUI.ShowDialog() | нулевой

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

<Окно

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Заголовок=”MainWindow” Высота=”350″ Ширина=”525″>

<Сетка>

<Имя кнопки = «Моя кнопка» Содержимое = «Кнопка» HorizontalAlignment = «Левое» Поле = «249,132,0,0» VerticalAlignment = «Верх» Ширина = «75»/>

<Label Name="MyLabel" Content="Label" HorizontalAlignment="Left" Margin="88,73,0,0″ VerticalAlignment="Top"/>

</сетка>

</окно>

При выполнении этот сценарий выдал вывод, показанный на рисунке A.

Изображение 4651
Рисунок A. Это результат кода на основе XAML.

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

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

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

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

$net = New-Object -ComObject Wscript.Network

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

Функция DisplayHelloWorldText{

Add-Type -AssemblyName System.Windows.Forms

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

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

$Label.Text = «Привет, мир»

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

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

$Form.Controls.Add($Label)

}

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

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

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

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

$Form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::Fixed3D

$Form.Text = «Привет, мир»

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

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

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

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

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

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

$Button1.Text = «Кнопка»

$Button1.Add_Click({DisplayHelloWorldText})

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

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

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

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

Вы можете увидеть вывод кода на рисунке B.

Изображение 4652
Рисунок B. Это выходные данные сценария Hello World, написанного в Native PowerShell.

Сравнивая два блока кода и два снимка экрана, можно сделать несколько ключевых выводов. Во-первых, выходы почти идентичны друг другу. Да, есть небольшие различия в шрифтах и цветах фона, но это легко изменить. Два скрипта делают одно и то же, а кнопка и вывод отображаются в одних и тех же местах в обеих программах. Даже размер окна идентичен. Дело в том, что нативная оболочка PowerShell может идеально имитировать все, что вы могли бы создать с помощью XAML. Недостатки использования собственного PowerShell заключаются в том, что код становится длиннее, и вы не можете использовать интерфейс Visual Studio «укажи и щелкни» для создания графического интерфейса.

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

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

Прежде чем я попытаюсь познакомить вас с кодом, мне нужно уделить немного времени и представить технику, которую я использую. Чтобы создать графический интерфейс PowerShell, я использовал возможности форм PowerShell. Вы можете думать о форме как об окне. Сама по себе форма — это просто пустой холст (пустое окно), в котором вы можете добавить все, что захотите. Форма может содержать изображения, текст, кнопки и множество элементов управления.

Вы можете построить форму в три шага. Первым шагом является загрузка необходимой сборки. Сборки являются частью платформы.NET. Идея их использования довольно проста. Когда вы пишете сценарий PowerShell, вы действительно не хотите давать Windows явные инструкции по рисованию окна. Представьте, что вам нужно написать код кнопки свертывания, функции перетаскивания и т. д. Microsoft пытается сэкономить ваше время, предоставляя вам набор стандартных блоков, называемых сборками. Эти сборки можно вызывать из PowerShell, и ваш сценарий может использовать уже существующую библиотеку кода. Эти сборки могут сэкономить вам много работы. В данном случае имя загружаемой сборки — System.Windows.Forms.

Следующее, что нам нужно сделать, это создать новый объект формы. Это можно сделать с помощью командлета PowerShell New-Object и ссылки на сборку, которую мы загрузили на предыдущем шаге.

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

Microsoft предоставляет отличный пример, в котором пустое окно (форма) создается с помощью трехстрочного сценария PowerShell. Три строки кода:

Add-Type -AssemblyName System.Windows.Forms

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

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

Вы можете увидеть вывод кода Microsoft на рисунке C.

Изображение 4653
Рисунок C: PowerShell создал пустое окно.

Вывод

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