GUI на PowerShell

PowerShellPowerShell — имхо прекрасная разработка Microsoft. А когда узнал что на нем можно использовать и классы NET то был в восторге 🙂 Возможности открываются такие, которые и не снились раньше людям которые занимаются поддержкой. Возможно поэтому Ms начало «сувать» данный продукт всюду где возможно. Недавно убедился, что с MS SQL 2008 он тоже идет…

Но хочу поговорить не об этом. То что PowerShell может использовать пространства имен .Net дает скриптовомму языку довольно причудливые возможности: например создание пользовательского интерфейса с помощью WinForms.
Если Вы не сильны в NET классах относящихся к WinForms — не беда. И так вооружаемся:

  • Visual Studio или SharpDevelop — это для того что бы рисовать интерфейс
  • PowerGUI — нам нужен прекрасный редактор (PowerGUI Script Editor) который в него входит
  • PowerShell — пользуюсь первой версией.

Запускаем VS или SharpDevelop и рисуем интерфейс. Например, что то вроде этого:
Нарисовали gui

Заглядываем, какой код сгенерил реактор (это файл *.designer.cs):

...	
this.label1 = new System.Windows.Forms.Label();
			this.textBox1 = new System.Windows.Forms.TextBox();
			this.butForPress = new System.Windows.Forms.Button();
			this.SuspendLayout();
			// 
			// label1
			// 
			this.label1.Location = new System.Drawing.Point(12, 9);
			this.label1.Name = "label1";
			this.label1.Size = new System.Drawing.Size(202, 11);
			this.label1.TabIndex = 0;
			this.label1.Text = "Введите что либо:";
			// 
			// textBox1
			// 
			this.textBox1.Location = new System.Drawing.Point(12, 23);
			this.textBox1.Name = "textBox1";
			this.textBox1.Size = new System.Drawing.Size(317, 20);
			this.textBox1.TabIndex = 1;
			// 
			// butForPress
			// 
			this.butForPress.Location = new System.Drawing.Point(220, 49);
			this.butForPress.Name = "butForPress";
			this.butForPress.Size = new System.Drawing.Size(109, 23);
			this.butForPress.TabIndex = 2;
			this.butForPress.Text = "Нажать сюда";
			this.butForPress.UseVisualStyleBackColor = true;
			// 
			// frmMain
			// 
			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
			this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
			this.ClientSize = new System.Drawing.Size(341, 85);
			this.Controls.Add(this.butForPress);
			this.Controls.Add(this.textBox1);
			this.Controls.Add(this.label1);
			this.MaximizeBox = false;
			this.Name = "frmMain";
			this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
			this.Text = "Пример окна";
			this.Load += new System.EventHandler(this.MainFormLoad);
			this.ResumeLayout(false);
			this.PerformLayout();
...

Открываем PowerGUI и переделываем эту «портянку» на PowerShell.
Вот что у меня получилось после 5-ти минутного редактирования.
+ добавим на кнопку butForPress обработку нажатия по которому будет выдаваться месседжбокс с введенным текстом.
Конечно, можно было указать и функцию для события, но учитывая что у нас только вывод сообщение — решил не мудрить

$label1 = New-Object System.Windows.Forms.Label;
$textBox1 = New-Object System.Windows.Forms.TextBox;
$butForPress = New-Object System.Windows.Forms.Button;			
#
# label1
#
$label1.Location = New-Object System.Drawing.Point(12, 9);
$label1.Name = "label1";
$label1.Size = New-Object System.Drawing.Size(202, 11);
$label1.TabIndex = 0;
$label1.Text = "Введите что либо:";
# 
# textBox1
#
$textBox1.Location = New-Object System.Drawing.Point(12, 23);
$textBox1.Name = "textBox1";
$textBox1.Size = New-Object System.Drawing.Size(317, 20);
$textBox1.TabIndex = 1;
#
# butForPress
#
$butForPress.Location = New-Object System.Drawing.Point(220, 49);
$butForPress.Name = "butForPress";
$butForPress.Size = New-Object System.Drawing.Size(109, 23);
$butForPress.TabIndex = 2;
$butForPress.Text = "Нажать сюда";
$butForPress.UseVisualStyleBackColor = $true;
#
# frmMain
#
$frmMain = New-Object System.Windows.Forms.Form;	# Создаем форму
$frmMain.ClientSize = New-Object System.Drawing.Size(341, 85);
$frmMain.AutoSizeMode = [System.Windows.Forms.AutoSizeMode]::GrowAndShrink;
$frmMain.AutoScaleDimensions = New-Object System.Drawing.SizeF(341, 85);
$frmMain.MaximizeBox = $false;
$frmMain.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen;
$frmMain.Text = “Пример окна”;

$frmMain.Controls.Add($butForPress);
$frmMain.Controls.Add($textBox1);
$frmMain.Controls.Add($label1);

# обработка для кнопки
$butForPress.Add_Click({[System.Windows.Forms.MessageBox]::Show("Вы ввели: " + $textBox1.Text)})
$frmMain.ShowDialog()

p.s.
А вот тут можно найти хороший пример уже полноценного GUI приложения на PowerShell.

GUI на PowerShell: 4 комментария

  1. borismor

    Спасибо за ссылку — оч интересно)
    Аналогичное приложение видел на VBScript.
    Но ваш пример более приближен к пользователям 🙂

  2. index

    зачем такой геморой с проектированием визуальных форм?
    когда есть PrimalForms (бесплатный), PrimalForms 2009 и очень скоро выходит PrimalForms 2011 ?

  3. BorisMor

    Ответ очевиден: потому что я ничего не знал про PrimalForms 🙂
    Хороший инструмент. Жалко что полная версия платная.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *