Так уж вышло, что очередная дата публикации статьи из рубрики «Совет недели» совпала с днем, который также именуют «праздником» или же «Днем святого Валентина», aka День влюбленных. Некоторые заморачиваются и пытаются устроить себе праздник, некоторые на него вообще никак не реагируют, но это личное дело каждого. Но раз уж сегодня такой день, я расскажу вам о том, как можно создать креативное поздравление при помощи возможностей Windows PowerShell.
Следовательно, дальше в этой небольшой заметке вы узнаете, как можно создать всплывающую форму средствами PowerShell, а также, в случае «массовой рассылки», как ее можно распространить сразу на несколько компьютеров при помощи групповой политики. Итак,
Креативное поздравление средствами Windows PowerShell
Сейчас мы с вами попробуем создать скрипт, при помощи которого будет открываться форма с текстом заголовка, картинкой, а также еще одним дополнительным текстовым полем. В принципе, задача не сложная. После того как такой скрипт будет написан, его можно либо указать в задаче локального планировщика для выполнения в требуемую дату и время, либо, в случае одновременного распространения на несколько компьютеров, создать такое же задание средствами возможностей предпочтений групповой политики.
Сразу предположим, что 2 изображения (значок с именем файла heart.ico и картинка image.jpg) скопированы на целевой компьютер заранее и находятся в папке C:\PowerShell\ValScript\Image. Итак, создаем сам скрипт:
1. Загрузка сборок
Для начала следует загрузить требуемые сборки, благодаря которым мы сможем создать саму форму. Сборки предназначены для того, чтобы вы могли реализовать некоторые функции, расширяющие возможности работы с различными объектами в скриптах Windows PowerShell. Такие сборки вы можете подгрузить, используя команду Reflection. В свою очередь, reflection работает с пространствами имен, сборками и классами. Теперь кратко о том, что собой представляю сборки. Сборка (она же Assembly) представляет собой некий набор функциональных возможностей, включая различные классы. В данном примере скрипт будет начинаться следующим образом:
[Reflection.Assembly]::LoadWithPartialName(«System») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«System.Windows.Forms») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«System.Drawing») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«mscorlib») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«System.Data») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«System.IO») | Out-Null
[Reflection.Assembly]::LoadWithPartialName(«Microsoft.VisualBasic») | Out-Null
[reflection.assembly]::LoadWithPartialName(«System.DirectoryServices») | Out-Null
После этого мы начинаем создавать новую функцию:
function Create-Splash
{
2. Создание формы
Наша форма будет содержать некоторые объекты, о которых более подробно речь пойдет ниже. Задаются объекты следующим образом:
# Задаем объекты нашей формы
$script:frmValentine = New-Object System.Windows.Forms.Form
$lblTitle = New-Object System.Windows.Forms.Label
$objImage = New-Object System.Windows.Forms.PictureBox
$lblTextDown = New-Object System.Windows.Forms.Label
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
где frmValentine – это сама форма, lblTitle – первое текстовое поле, objImage – картинка, а lblTextDown – это текстовом поле, которое будет отображаться в самом конце данной формы.
Теперь самое время создать собственно форму. Для этого вводим следующее:
# Рисуем саму форму
$frmValentine.BackColor = [System.Drawing.Color]::FromArgb(255,255,255,255)
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 550
$System_Drawing_Size.Width = 500
$frmValentine.ClientSize = $System_Drawing_Size
$frmValentine.DataBindings.DefaultDataSourceUpdateMode = 0
$frmValentine.Icon = [System.Drawing.Icon]::ExtractAssociatedIcon(‘C:\PowerShell\ValScript\Image\heart.ico’)
$frmValentine.Name = «frmValentine»
$frmValentine.StartPosition = 1
$frmValentine.Text = «Праздничная форма»
Ключевые составляющие:
- Height – высота формы;
- Width – ширина формы;
- Icon – значок окна с формой;
- Name – имя формы для PowerShell;
- Text – наименование отображаемого диалогового окна.
3. Блоки с текстом и картинкой
На данном этапе готово одно только диалоговое окно, от которого пока нет никакого проку. Теперь нужно добавить элементы. Создаются все они практически одинаково. Для этого следует воспользоваться таким кодом:
# Первый блок с текстом
$lblTitle.AutoSize = $True
$lblTitle.DataBindings.DefaultDataSourceUpdateMode = 0
$lblTitle.Font = New-Object System.Drawing.Font(«Arial»,15,1,3,0)
$lblTitle.ForeColor = [System.Drawing.Color]::FromArgb(255,64,0,64)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 75
$System_Drawing_Point.Y = 15
$lblTitle.Location = $System_Drawing_Point
$lblTitle.Name = «lblTitle»
$lblTitle.TabIndex = 0
$lblTitle.Text = «В день Святого Валентина…»
$frmValentine.Controls.Add($lblTitle)
Здесь:
- New-Object System.Drawing.Font отвечает за шрифт надписи;
- [System.Drawing.Color]::FromArgb – ее цвет;
- New-Object System.Drawing.Point – расположение текстового блока, с учетом координат Х и Y;
- Text – соответственно текст.
Остальные блоки создаются следующим образом:
# Блок с картинкой
$objImage.DataBindings.DefaultDataSourceUpdateMode = 0
$objImage.Image = [System.Drawing.Image]::FromFile(‘C:\PowerShell\ValScript\Image\image.png’)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 23
$System_Drawing_Point.Y = 50
$objImage.Location = $System_Drawing_Point
$objImage.Name = «objImage»
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 311
$System_Drawing_Size.Width = 450
$objImage.Size = $System_Drawing_Size
$objImage.SizeMode = 1
$objImage.TabIndex = 1
$objImage.TabStop = $False
$frmValentine.Controls.Add($objImage)
# Текст снизу
$lblTextDown.AutoSize = $True
$lblTextDown.DataBindings.DefaultDataSourceUpdateMode = 0
$lblTextDown.Font = New-Object System.Drawing.Font(«Times New Roman»,15.75,3,3,0)
$lblTextDown.ForeColor = [System.Drawing.Color]::FromArgb(255,0,0,192)
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 12
$System_Drawing_Point.Y = 500
$lblTextDown.Location = $System_Drawing_Point
$lblTextDown.Name = «lblTextDown»
$lblTextDown.TabIndex = 2
$lblTextDown.Text = «Здесь должен быть какой-то текст»
$frmValentine.Controls.Add($lblTextDown)
Можно отметить лишь то, что в случае с блоком с изображением, его размер можно определить при помощи New-Object System.Drawing.Size
4. Сохранение состояния формы и вывод ее отображения
Для того чтобы сохранить состояние созданного диалогового окна и вывести его на экран, следует прописать:
#Сохраняем состояние формы
InitialFormWindowState = $frmValentine.WindowState
frmValentine.add_Load($OnLoadForm_StateCorrection)
# Отображение формы
$frmValentine.Show()| Out-Null
}
Также было бы полезным дать возможность форме закрыться самостоятельно после того, как ваш адресат сможет заметить и оценить ваши труды. Для этого указываем
Create-Splash
Start-Sleep -seconds 30
$frmValentine.Close()
Готово.
Теперь осталось только сохранить этот сценарий с разрешением ps1 и вовремя запустить на целевом компьютере. В результате на 30 секунд должна отобразиться форма, которую вы можете увидеть на следующей иллюстрации:
Рис. 1. Созданная форма при помощи Windows PowerShell