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

В Windows PowerShell дос­тупны два вари­анта соз­дания GUI с помощью объ­ектов .NET Framework. Клас­сичес­кие эле­мен­ты интерфей­са Windows мож­но добавить с помощью биб­лиоте­ки .NET Windows Forms (WinForms), которая под­держи­валась в .NET c самого начала. Более сов­ремен­ный вари­ант дизай­на реали­зует­ся с помощью тех­нологии Windows Presentation Foundation (WPF), которая была добав­лена поз­же в .NET Framework 3.0.

Современный PowerShell

Современный PowerShell. Андрей Попов
Сов­ремен­ный PowerShell. Андрей Попов

Эта статья — гла­ва из кни­ги Андрея Попова «Сов­ремен­ный PowerShell», вышед­шей в изда­тель­стве «БХВ» в мар­те это­го года. В кни­ге под­робно опи­сан язык PowerShell и работа с обо­лоч­кой Windows PowerShell в Windows Terminal, вза­имо­дей­ствие с фай­ловой сис­темой, струк­туриро­ван­ными дан­ными и веб‑ресур­сами. Автор раз­бира­ет управле­ние про­цес­сами, служ­бами и сер­верами авто­мати­зации, рас­ска­зыва­ет, как соз­дать GUI для сце­нари­ев Windows PowerShell, уде­ляет вни­мание кросс‑плат­формен­ным воз­можнос­тям PowerShell в macOS и Linux.

Ес­ли ты адми­нис­три­руешь рабочие стан­ции, сер­веры или локаль­ные сети под управле­нием Windows, кни­га «Сов­ремен­ный PowerShell» поможет тебе осво­ить сек­реты и хит­рости этой тех­нологии и авто­мати­зиро­вать мно­жес­тво рутин­ных задач.

 

Построение GUI с помощью Windows Forms

Да­вай соз­дадим прос­тей­шую фор­му с над­писью и кноп­кой, выпол­няя коман­ды непос­редс­твен­но в кон­соли PowerShell.

Как мы зна­ем, плат­форма .NET пос­тро­ена таким обра­зом, что для обра­щения к тем или иным объ­ектам нуж­но пред­варитель­но заг­рузить в опе­раци­онную память соот­ветс­тву­ющую сбор­ку (assembly) — динами­чес­кую биб­лиоте­ку опре­делен­ного вида. Наибо­лее час­то исполь­зующиеся сбор­ки заг­ружа­ются в PowerShell авто­мати­чес­ки. Для обра­щения к объ­ектам WinForms из PowerShell нуж­но сна­чала заг­рузить сбор­ку, под­держи­вающую эти объ­екты:

PS C:\Users\andrv> Add-Type -Assemblyname System.Windows.Forms

Гра­фичес­кий интерфейс в тер­минах WinForms — это набор эле­мен­тов управле­ния (кноп­ки, поля вво­да, спис­ки, флаж­ки и т. д.), которые рас­полага­ются в кон­тей­нерах (фор­мы, панели, вклад­ки). Изме­няя зна­чения свой­ств объ­ектов, соот­ветс­тву­ющих эле­мен­там управле­ния, мы опре­деля­ем внеш­ний вид этих эле­мен­тов (раз­мер, цвет фона, исполь­зуемый шрифт и т. д.).

Лю­бое гра­фичес­кое при­ложе­ние WinForms дол­жно иметь глав­ную фор­му — объ­ект типа Windows.Forms.Form. Соз­дадим нашу глав­ную фор­му и сох­раним соот­ветс­тву­ющий объ­ект в перемен­ной $form:

PS C:\Users\andrv> $form = New-Object System.Windows.Forms.Form

На­ша фор­ма пока находит­ся толь­ко в опе­ратив­ной памяти, на экра­не мы ее не видим. Зададим заголо­вок фор­мы (свой­ство Text объ­екта $form):

PS C:\Users\andrv> $form.Text = 'Первая форма'

По­мес­тим на фор­му над­пись — для это­го нуж­но соз­дать объ­ект типа System.Windows.Forms.Label и прис­воить зна­чение свой­ству Text это­го объ­екта:

PS C:\Users\andrv> $label = New-Object System.Windows.Forms.Label
PS C:\Users\andrv> $label.Text = 'Привет!'

Кро­ме над­писи, на фор­му мож­но помещать дру­гие эле­мен­ты управле­ния, которым соот­ветс­тву­ют объ­екты из прос­транс­тва имен System.Windows.Forms. Некото­рые из этих объ­ектов пред­став­лены в таб­лице ниже.

Объ­ект Опи­сание
Button Кноп­ка на фор­ме. Над­пись на кноп­ке зада­ется свой­ством Text
CheckBox Фла­жок (чек­бокс) — эле­мент управле­ния для выбора одно­го или нес­коль­ких пун­ктов из пред­ложен­ных вари­антов
CheckedListBox Сос­тоит из спис­ка эле­мен­тов (ListBox), перед каж­дым из которых помещен фла­жок (чек­бокс) для воз­можнос­ти выбора
ComboBox Сос­тоит из поля для вво­да тек­ста (TextBox) и свя­зан­ного с ним рас­кры­вающе­гося спис­ка зна­чений (ListBox)
DataGridView Ос­новной эле­мент управле­ния для пред­став­ления таб­личных дан­ных (под­держи­вает связь с базой дан­ных)
GroupBox Ис­поль­зует­ся для выделе­ния групп эле­мен­тов управле­ния (чаще все­го ради­окно­пок), воз­ле которых отоб­ража­ется рам­ка
ImageList Кон­тей­нер для раз­мещения кол­лекции изоб­ражений, исполь­зуемых дру­гими эле­мен­тами управле­ния (нап­ример, ListView и TreeView)
ListBox Спи­сок эле­мен­тов, которые могут быть выб­раны. Может содер­жать прос­той текст или объ­екты
Panel Ви­димый или невиди­мый кон­тей­нер для груп­пиров­ки эле­мен­тов управле­ния
PictureBox Ис­поль­зует­ся для раз­мещения гра­фичес­ких изоб­ражений в нес­коль­ких стан­дар­тных фор­матах
ProgressBar Ин­дикатор хода выпол­нения какого‑либо про­цес­са
RadioButton Пе­рек­лючатель (ради­окнопка) для выбора одно­го вари­анта из спис­ка пред­ложен­ных
TextBox Эле­мент для вво­да тек­ста в одной или нес­коль­ких стро­ках
TreeView Отоб­ражение дан­ных в виде узлов дерева

Для задания раз­меров и рас­положе­ния эле­мен­тов управле­ния исполь­зуют­ся объ­екты типа System.Drawing.Point, в которые переда­ются коор­динаты: пер­вая — по горизон­тали, вто­рая — по вер­тикали (начало коор­динат раз­меща­ется в вер­хнем левом углу, ось X нап­равле­на впра­во, ось Y — вниз). Нашу над­пись мы смес­тим от вер­хне­го левого угла на 20 пик­селов впра­во и 10 пик­селов вниз. Объ­ект с нуж­ными коор­дината­ми записы­вает­ся в свой­ство Location объ­екта $label:

PS C:\Users\andrv> $label.Location = New-Object System.Drawing.Point 20,10

По­ка над­пись пред­став­ляет собой отдель­ный объ­ект, который не свя­зан с основной фор­мой. Помес­тим над­пись на фор­му, добавив объ­ект $label в кол­лекцию $form.Controls с помощью метода Add:

PS C:\Users\andrv> $form.Controls.Add($label)

Те­перь соз­дадим кноп­ку (объ­ект типа Windows.Forms.Button) с над­писью «Наж­ми!»:

PS C:\Users\andrv> $button = New-Object Windows.Forms.Button
PS C:\Users\andrv> $button.Text = "Нажми!"

За­дадим коор­динаты для кноп­ки:

PS C:\Users\andrv> $button.Location = New-Object System.Drawing.Point 20,40

По­мес­тим кноп­ку на фор­му:

PS C:\Users\andrv> $form.Controls.Add($button)

Те­перь добавим нашей фор­ме фун­кци­ональ­ность — по нажатию кноп­ки $button текст в над­писи $label будет менять­ся на «Пока!». Для это­го с помощью метода Add_Click нуж­но опре­делить обра­бот­чик события Click на кноп­ке. В этот метод переда­ется блок кода, который будет выпол­нен при нажатии кноп­ки. В нашем слу­чае дос­таточ­но изме­нить зна­чение свой­ства $label.Text:

PS C:\Users\andrv> $button.Add_Click({$label.Text='Пока!'})

Ес­ли бы обра­бот­чик события был более объ­емный, то удоб­нее было бы заранее сох­ранить соот­ветс­тву­ющий блок кода в перемен­ной, которую затем передать в метод Add_Click.

Те­перь с помощью метода ShowDialog мож­но отоб­разить соз­данную фор­му с эле­мен­тами управле­ния на экра­не.

PS C:\Users\andrv> $form.ShowDialog()
Форма, созданная в PowerShell
Фор­ма, соз­данная в PowerShell

По нажатию кноп­ки над­пись на фор­ме изме­нит­ся.

Изменения в элементе на форме
Из­менения в эле­мен­те на фор­ме

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    7 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии