Powershell — довольно мощное средство автоматизации, которое позволяет «прозрачно» использовать объекты .NET Framework. Это позволяет очень легко использовать такие объекты, как GUI интерфейс для ваших скриптов.
Рассмотрим, как можно создать форму и расположить на ней стандартные элементы формы.
Элементы которые я создал на форме:
Label
button
CheckBox
RadioButton
ComboBox
TextBox
ChekedListBox
GroupBox
ListBox
TabControl
ListView
TreeView
DateTimePicker
TrackBar
PictureBox
ProgressBar
HScrollBar
VScrollBar
ContextMenu
Menu
Получилась вот такая форма:
Что бы получить эту форму, надо выполнить следующий скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
Add-Type -assembly System.Windows.Forms $main_form = New-Object System.Windows.Forms.Form $main_form.Text ='Видемое название формы' $main_form.Width = 100 $main_form.Height = 100 $main_form.AutoSize = $true $Label = New-Object System.Windows.Forms.Label $Label.Text = "Label" $Label.Location = New-Object System.Drawing.Point(0,10) $Label.AutoSize = $true $main_form.Controls.Add($Label) $button = New-Object System.Windows.Forms.Button $button.Text = 'button' $button.Location = New-Object System.Drawing.Point(160,10) $main_form.Controls.Add($button) $CheckBox = New-Object System.Windows.Forms.CheckBox $CheckBox.Text = 'CheckBox' $CheckBox.AutoSize = $true $CheckBox.Checked = $true $CheckBox.Location = New-Object System.Drawing.Point(0,40) $main_form.Controls.Add($CheckBox) $RadioButton = New-Object System.Windows.Forms.RadioButton $RadioButton.Location = New-Object System.Drawing.Point(160,40) $RadioButton.Text = 'RadioButton' $RadioButton.AutoSize = $true $main_form.Controls.Add($RadioButton) $ComboBox = New-Object System.Windows.Forms.ComboBox $ComboBox.DataSource = @('ComboBox','2','3','4','5','6') $ComboBox.Location = New-Object System.Drawing.Point(0,70) $main_form.Controls.Add($ComboBox) $TextBox = New-Object System.Windows.Forms.TextBox $TextBox.Location = New-Object System.Drawing.Point(160,70) $TextBox.Text = 'TextBox' $main_form.Controls.Add($TextBox) $CheckedListBox = New-Object System.Windows.Forms.CheckedListBox $CheckedListBox.Items.ADD("CheckedListBox") $CheckedListBox.Items.ADD("Items 2") $CheckedListBox.Items.ADD("3") $CheckedListBox.Location = New-Object System.Drawing.Point(0,100) $main_form.Controls.Add($CheckedListBox) $GroupBox = New-Object System.Windows.Forms.GroupBox $GroupBox.Text = "GroupBox" $GroupBox.AutoSize = $true $GroupBox.Location = New-Object System.Drawing.Point(160,100) $button2 = New-Object System.Windows.Forms.Button $button2.Text = 'button2' $button2.Location = New-Object System.Drawing.Point(0,30) $GroupBox.Controls.Add($button2) $CheckBox2 = New-Object System.Windows.Forms.CheckBox $CheckBox2.Text = 'CheckBox2' $CheckBox2.AutoSize = $true $CheckBox2.Checked = $true $CheckBox2.Location = New-Object System.Drawing.Point(0,60) $GroupBox.Controls.Add($CheckBox2) $main_form.Controls.Add($GroupBox) $ListBox = New-Object System.Windows.Forms.ListBox $ListBox.Location = New-Object System.Drawing.Point(0,210) $ListBox.Items.Add('ListBox'); $ListBox.Items.Add('2'); $ListBox.Items.Add('3'); $main_form.Controls.add($ListBox) $TabControl = New-Object System.Windows.Forms.TabControl $TabPage1 = New-Object System.Windows.Forms.TabPage $TabPage1.Text = 'TabPage1' $TabLabel = New-Object System.Windows.Forms.Label $TabLabel.Text = "TabControl" $TabLabel.Location = New-Object System.Drawing.Point(60,30) $TabLabel.AutoSize = $true $TabPage1.Controls.Add($TabLabel) $TabPage2 = New-Object System.Windows.Forms.TabPage $TabPage2.Text = 'TabPage2' $TabControl.Controls.Add($TabPage1) $TabControl.Controls.Add($TabPage2) $TabControl.Location = New-Object System.Drawing.Point(160,210) $main_form.Controls.add($TabControl) $ListView = New-Object System.Windows.Forms.ListView $ListViewItem1 = New-Object System.Windows.Forms.ListViewItem("--=1=--") $ListViewItem2 = New-Object System.Windows.Forms.ListViewItem("--=2=--") $ListViewItem3 = New-Object System.Windows.Forms.ListViewItem("--=3=--") $ListViewItem4 = New-Object System.Windows.Forms.ListViewItem("--=4=--") $ListView.Items.Add($ListViewItem1) $ListView.Items.Add($ListViewItem2) $ListView.Items.Add($ListViewItem3) $ListView.Items.Add($ListViewItem4) $ListView.Location = New-Object System.Drawing.Point(0,320) $main_form.Controls.add($ListView) $TreeView = New-Object System.Windows.Forms.TreeView $TreeViewNode=$TreeView.Nodes.Add("1") $TreeViewNode.Nodes.Add("2") $TreeView.Nodes.Add("3") $TreeView.Location = New-Object System.Drawing.Point(160,320) $main_form.Controls.add($TreeView) $DateTimePicker = New-Object System.Windows.Forms.DateTimePicker $DateTimePicker.Location = New-Object System.Drawing.Point(0,430) $main_form.Controls.add($DateTimePicker) $TrackBar = New-Object System.Windows.Forms.TrackBar $TrackBar.Location = New-Object System.Drawing.Point(200,430) $TrackBar.Autosize = $true $TrackBar.Value=5 $main_form.Controls.add($TrackBar) $PictureBox = New-Object System.Windows.Forms.PictureBox $PictureBox.Load('D:\favico.jpg') $PictureBox.Location = New-Object System.Drawing.Point(0,460) $main_form.Controls.add($PictureBox) $ProgressBar = New-Object System.Windows.Forms.ProgressBar $ProgressBar.Location = New-Object System.Drawing.Point(100,460) $ProgressBar.Value = 50 $main_form.Controls.add($ProgressBar) $HScrollBar = New-Object System.Windows.Forms.HScrollBar $HScrollBar.Size = New-Object System.Drawing.Size(176, 16) $HScrollBar.Location = New-Object System.Drawing.Point(0,510) $main_form.Controls.add($HScrollBar) $VScrollBar = New-Object System.Windows.Forms.VScrollBar $VScrollBar.Size = New-Object System.Drawing.Size(16, 176) $VScrollBar.Location = New-Object System.Drawing.Point(380,0) $main_form.Controls.add($VScrollBar) $ContextMenu = New-Object System.Windows.Forms.ContextMenu $ContextMenu.MenuItems.Add("ContextMenu") $ContextMenu.MenuItems.Add("1") $main_form.ContextMenu = $ContextMenu $Menu = New-Object System.Windows.Forms.MainMenu $menuItem1= New-Object System.Windows.Forms.menuItem $menuItem1.Text= 'menuItem1' $Menu.MenuItems.Add($menuItem1) $menuItem2= New-Object System.Windows.Forms.menuItem $menuItem2.Text= 'menuItem2' $menuItem1.MenuItems.Add($menuItem2) $menuItem3= New-Object System.Windows.Forms.menuItem $menuItem3.Text= 'menuItem3' $Menu.MenuItems.Add($menuItem3) $main_form.Menu= $Menu $main_form.ShowDialog() |
Рассмотрим этот код подробнее:
1 |
Add-Type -assembly System.Windows.Forms |
Определяем в сеансе Powershell класс «System.Windows.Forms» именно он нужен, для создания формы, и в нём же находятся элементы формы.
Forms
3 |
$main_form = New-Object System.Windows.Forms.Form |
Создаём форму $main_form, которую мы будем наполнять управляющими элементами.
4 |
$main_form.Text ='Видемое название формы' |
Это текст будет отображаться в заголовке формы $main_form.
5 |
$main_form.Width = 100 |
Минимальная ширина формы $main_form.
6 |
$main_form.Height = 100 |
Минимальная высота формы $main_form.
7 |
$main_form.AutoSize = $true |
Форма будет автоматически растягиваться, если элементы расположенные на форме выйдут за границуМинимальная ширина или Минимальной высоты формы.
$main_form.ShowDialog()
В конце скрипта мы отобразим форму $main_form.
Label
9 |
$Label = New-Object System.Windows.Forms.Label |
Создаём метку $Label
10 |
$Label.Text = "Label" |
Задаём текст, который будет выводится в метке $Label.
11 |
$Label.Location = New-Object System.Drawing.Point(0,10) |
Задаём расположение метки $Label, относительно формы.
12 |
$Label.AutoSize = $true |
Включаем авторастягивание метки $Label если её содержимое выйдет за границы видимости.
13 |
$main_form.Controls.Add($Label) |
Добавляем метку $Label на форму
Button
15 |
$button = New-Object System.Windows.Forms.Button |
Создаём элемент, кнопку $button.
16 |
$button.Text = 'button' |
Задаём текст котрый будет написан на кнопке $button.
17 |
$button.Location = New-Object System.Drawing.Point(160,10) |
Определяем расположение кнопки $button.
18 |
$main_form.Controls.Add($button) |
Добавляем кнопку $button на форму.
CheckBox
20 |
$CheckBox = New-Object System.Windows.Forms.CheckBox |
Объявляем элемент флажка $CheckBox
21 |
$CheckBox.Text = 'CheckBox' |
Задаём текст который будет виден на элементе с права от флажка $CheckBox
22 |
$CheckBox.AutoSize = $true |
Разрешаем элементу увеличивать размер, если части элемента выйдут за переделы его видимости.
23 |
$CheckBox.Checked = $true |
Устанавливаем флажёк в положение $true, будет отображаться галочка
24 |
$CheckBox.Location = New-Object System.Drawing.Point(0,40) |
Устанавливаем полжение элемента $CheckBox на форме
25 |
$main_form.Controls.Add($CheckBox) |
Добавляем элемент $CheckBox на форму
RadioButton
27 |
$RadioButton = New-Object System.Windows.Forms.RadioButton |
Объявляем элемент $RadioButton
28 |
$RadioButton.Location = New-Object System.Drawing.Point(160,40) |
Устанавливаем полжение элемента $RadioButton на форме
29 |
$RadioButton.Text = 'RadioButton' |
Задаём текст, который будет виден на элементе $RadioButton.
30 |
$RadioButton.AutoSize = $true |
Разрешаем элементу $RadioButton увеличивать размер, если части элемента выйдут за переделы его видимости.
31 |
$main_form.Controls.Add($RadioButton) |
Добавляем элемент на форму
ComboBox
33 |
$ComboBox = New-Object System.Windows.Forms.ComboBox |
Объявляем элемент $ComboBox
34 |
$ComboBox.DataSource = @('ComboBox','2','3','4','5','6') |
Задаём список элемента $ComboBox, который будет виден, в выпадающем списке, по умолчанию видно первое значение.
35 |
$ComboBox.Location = New-Object System.Drawing.Point(0,70) |
Устанавливаем полжение элемента $ComboBox на форме
36 |
$main_form.Controls.Add($ComboBox) |
Добавляем элемент $ComboBox на форму
TextBox
38 |
$TextBox = New-Object System.Windows.Forms.TextBox |
Объявляем элемент $TextBox
39 |
$TextBox.Location = New-Object System.Drawing.Point(160,70) |
Устанавливаем полжение элемента $TextBox на форме
40 |
$TextBox.Text = 'TextBox' |
Задаём текст, который будет вбит в элементе $TextBox, в дальнейшем его можно будет редактировать.
41 |
$main_form.Controls.Add($TextBox) |
Добавляем элемент $TextBox на форму
CheckedListBox
43 |
$CheckedListBox = New-Object System.Windows.Forms.CheckedListBox |
Объявляем элемент $CheckedListBox
44 45 46 47 48 |
$CheckedListBox.Items.ADD("ChekedListBox") $CheckedListBox.Items.ADD("Items 2") $CheckedListBox.Items.ADD("3") |
Добавляем внутреннии элементы в элемент $CheckedListBox.
47 |
$CheckedListBox.Location = New-Object System.Drawing.Point(0,100) |
Устанавливаем полжение элемента на форме
48 |
$main_form.Controls.Add($CheckedListBox) |
Добавляем элемент $CheckedListBox на форму
GroupBox
50 |
$GroupBox = New-Object System.Windows.Forms.GroupBox |
Объявляем элемент $GroupBox
51 |
$GroupBox.Text = "GroupBox" |
Задаём текст, который будет виден в заголовке элемента $GroupBox.
52 |
$GroupBox.AutoSize = $true |
Разрешаем элементу $GroupBox автоматически увеличить свои размеры, если находящиеся в нём элементы выходят за границу видимости.
53 |
$GroupBox.Location = New-Object System.Drawing.Point(160,100) |
Устанавливаем полжение элемента$GroupBox на форме
54 55 56 57 |
$button2 = New-Object System.Windows.Forms.Button $button2.Text = 'button2' $button2.Location = New-Object System.Drawing.Point(0,30) $GroupBox.Controls.Add($button2) |
Создаём элемет кноку $button2 и помещаем его внутрь элемента GroupBox, при этом координаты свойства Location будут относительно верхнего левого края объекта GroupBox
58 59 60 61 62 63 |
$CheckBox2 = New-Object System.Windows.Forms.CheckBox $CheckBox2.Text = 'CheckBox2' $CheckBox2.AutoSize = $true $CheckBox2.Checked = $true $CheckBox2.Location = New-Object System.Drawing.Point(0,60) $GroupBox.Controls.Add($CheckBox2) |
Создаём элемет флажок $CheckBox2 и помещаем его внутрь элемента $GroupBox, при этом координаты свойства Location будут относительно верхнего левого края объекта $GroupBox.
64 |
$main_form.Controls.Add($GroupBox) |
Добавляем элемент $GroupBox на форму
ListBox
66 |
$ListBox = New-Object System.Windows.Forms.ListBox |
Объявляем элемент $ListBox
67 |
$ListBox.Location = New-Object System.Drawing.Point(0,210) |
Устанавливаем полжение элемента $ListBox на форме
68 69 70 |
$ListBox.Items.Add('ListBox'); $ListBox.Items.Add('2'); $ListBox.Items.Add('3'); |
Создаём строчки в $ListBox с именами ‘ListBox’, ‘2’, ‘3’
71 |
$main_form.Controls.add($ListBox) |
Добавляем элемент $ListBox на форму
TabControl
73 |
$TabControl = New-Object System.Windows.Forms.TabControl |
Объявляем элемент $TabControl
74 |
$TabPage1 = New-Object System.Windows.Forms.TabPage |
Объявляем новый элемент вкладка $TabPage1
75 |
$TabPage1.Text = 'TabPage1' |
Присваиваем элементу вкладка $TabPage1 текст, он будет отображаться в названии вкладки.
76 77 78 79 80 |
$TabLabel = New-Object System.Windows.Forms.Label $TabLabel.Text = "TabControl" $TabLabel.Location = New-Object System.Drawing.Point(60,30) $TabLabel.AutoSize = $true $TabPage1.Controls.Add($TabLabel) |
Объявляем элемент $TabLabel и размещаем его на вкладке $TabLabel при этом координтаы элемента $TabLabel.Location будут относительно левого верхнего угла вкладки $TabLabel
81 82 |
$TabPage2 = New-Object System.Windows.Forms.TabPage $TabPage2.Text = 'TabPage2' |
Объявлем ещё одну вкладку $TabPage2 и подписываем её.
83 84 |
$TabControl.Controls.Add($TabPage1) $TabControl.Controls.Add($TabPage2) |
Добавляем эти вкладки на элемент $TabControl
85 |
$TabControl.Location = New-Object System.Drawing.Point(160,210) |
Устанавливаем полжение элемента $TabControl на форме
86 |
$main_form.Controls.add($TabControl) |
Добавляем элемент $TabControl на форму
ListView
88 |
$ListView = New-Object System.Windows.Forms.ListView |
Объявляем элемент $ListView
89 90 91 92 |
$ListViewItem1 = New-Object System.Windows.Forms.ListViewItem("--=1=--") $ListViewItem2 = New-Object System.Windows.Forms.ListViewItem("--=2=--") $ListViewItem3 = New-Object System.Windows.Forms.ListViewItem("--=3=--") $ListViewItem4 = New-Object System.Windows.Forms.ListViewItem("--=4=--") |
Объявляем элементы которые будут находится в $ListView с видимым отображением в ввиде текста «—=1=—«, «—=2=—«, «—=3=—» и «—=4=—»
93 94 95 96 |
$ListView.Items.Add($ListViewItem1) $ListView.Items.Add($ListViewItem2) $ListView.Items.Add($ListViewItem3) $ListView.Items.Add($ListViewItem4) |
Добавляем эти элементы на $ListView
97 |
$ListView.Location = New-Object System.Drawing.Point(0,320) |
Устанавливаем полжение элемента $ListView на форме
98 |
$main_form.Controls.add($ListView) |
Добавляем элемент $ListView на форму
TreeView
100 |
$TreeView = New-Object System.Windows.Forms.TreeView |
Объявляем элемент дерева $TreeView
101 |
$TreeViewNode=$TreeView.Nodes.Add("1") |
Создадим первый узел $TreeViewNode с отображаемым текстом в $TreeView «1»
102 |
$TreeViewNode.Nodes.Add("2") |
Тогда мы можем добавить в узел $TreeViewNode другой узел с отображаемым текстом «2»
103 |
$TreeView.Nodes.Add("3") |
Добавляем узел «3» к корню дерева
104 |
$TreeView.Location = New-Object System.Drawing.Point(160,320) |
Устанавливаем полжение элемента на форме
105 |
$main_form.Controls.add($TreeView) |
Добавляем элемент $TreeView на форму $main_form
DateTimePicker
107 |
$DateTimePicker = New-Object System.Windows.Forms.DateTimePicker |
Объявляем элемент $DateTimePicker
108 |
$DateTimePicker.Location = New-Object System.Drawing.Point(0,430) |
Устанавливаем полжение элемента $DateTimePicker на форме
109 |
$main_form.Controls.add($DateTimePicker) |
Добавляем элемент $DateTimePicker на форму $main_form
TrackBar
111 |
$TrackBar = New-Object System.Windows.Forms.TrackBar |
Объявляем элемент ползунок $TrackBar
112 |
$TrackBar.Location = New-Object System.Drawing.Point(200,430) |
Устанавливаем полжение элемента $TrackBar на форме
113 |
$TrackBar.Autosize = $true |
Разрешаем элементу $TrackBar увеличивать размер, если он не будет вмещаться в ввидимую часть.
114 |
$TrackBar.Value=5 |
Устанавливаем значение $TrackBar на 5 деление.
115 |
$main_form.Controls.add($TrackBar) |
Добавляем элемент $TrackBar на форму $main_form
PictureBox
117 |
$PictureBox = New-Object System.Windows.Forms.PictureBox |
Объявляем элемент $PictureBox
118 |
$PictureBox.Load('D:\favico.jpg') |
Загружаем картинку ‘D:\favico.jpg’ в элемент $PictureBox
119 |
$PictureBox.Location = New-Object System.Drawing.Point(0,460) |
Устанавливаем полжение элемента $PictureBox на форме
120 |
$main_form.Controls.add($PictureBox) |
Добавляем элемент $PictureBox на форму $PictureBox
ProgressBar
122 |
$ProgressBar = New-Object System.Windows.Forms.ProgressBar |
Объявляем элемент $ProgressBar
123 |
$ProgressBar.Location = New-Object System.Drawing.Point(100,460) |
Устанавливаем полжение элемента $ProgressBar на форме
124 |
$ProgressBar.Value = 50 |
Устанавливаем значение $ProgressBar в 50
125 |
$main_form.Controls.add($ProgressBar) |
Добавляем элемент $ProgressBar на форму $main_form
HScrollBar
127 |
$HScrollBar = New-Object System.Windows.Forms.HScrollBar |
Объявляем элемент $HScrollBar
128 |
$HScrollBar.Size = New-Object System.Drawing.Size(176, 16) |
Устанавливаем размер элемента $HScrollBar
129 |
$HScrollBar.Location = New-Object System.Drawing.Point(0,510) |
Устанавливаем полжение элемента $HScrollBar на форме
130 |
$main_form.Controls.add($HScrollBar) |
Добавляем элемент $HScrollBar на форму $main_form
VScrollBar
132 |
$VScrollBar = New-Object System.Windows.Forms.VScrollBar |
Объявляем элемент $VScrollBar
133 |
$VScrollBar.Size = New-Object System.Drawing.Size(16, 176) |
Устанавливаем размер элемента $VScrollBar
134 |
$VScrollBar.Location = New-Object System.Drawing.Point(380,0) |
Устанавливаем полжение элемента $VScrollBar на форме
135 |
$main_form.Controls.add($VScrollBar) |
Добавляем элемент $VScrollBar на форму $main_form
ContextMenu
137 |
$ContextMenu = New-Object System.Windows.Forms.ContextMenu |
Объявляем временный элемент $ContextMenu
138 |
$ContextMenu.MenuItems.Add("ContextMenu") |
Добавляем первый пункт $ContextMenu
139 |
$ContextMenu.MenuItems.Add("1") |
Добавляем второй пункт $ContextMenu
140 |
$main_form.ContextMenu = $ContextMenu |
Присваиваем контекстному меню форме $main_form контекстное меню $ContextMenu
Menu
142 |
$Menu = New-Object System.Windows.Forms.MainMenu |
Объявляем временны элемент $Menu
143 |
$menuItem1= New-Object System.Windows.Forms.menuItem |
Объявляем первый элемент меню $menuItem1
144 |
$menuItem1.Text= 'menuItem1' |
Изменяем отображаемый текст $menuItem1
145 |
$Menu.MenuItems.Add($menuItem1) |
Добавляем этот элемент $menuItem1 в меню $Menu
146 147 |
$menuItem2= New-Object System.Windows.Forms.menuItem $menuItem2.Text= 'menuItem2' |
Объявляем ещё один элемент меню $menuItem2, и изменяем его отображаемый текст
148 |
$menuItem1.MenuItems.Add($menuItem2) |
Добавляем элемент $menuItem2 в $menuItem1
149 150 151 |
$menuItem3= New-Object System.Windows.Forms.menuItem $menuItem3.Text= 'menuItem3' $Menu.MenuItems.Add($menuItem3) |
Объявляем новый элемент $menuItem3 в меню $Menu
152 |
$main_form.Menu= $Menu |
Присваиваем Меню формы $main_form значение временному меню $Menu
154 |
$main_form.ShowDialog() |
Отображает форму $main_form
Добрый день, спасибо за посты, очень познавательны, возник один вопрос, прикручиваю к скрипту выпадающий список,
но заметил одну особенность, текст в выпадающем списке можно изменить, искал на msdn по комбобоксу инфу, но что-то не нашел ничего подходящего, может вы сможете подсказать, как сделать этот список не редактируемым, что не допустить появления в списке случайно нажатых символов? И второй вопрос, можно задать всей форме при запуске поверх всех окон принудительно? Спасибо.
И вам доброго времени суток. Спасибо за лестный отзыв. 🙂
С комбо боксом всё просто, надо поменять стиль DropDownStyle. Для моего примера это будет выглядеть так:
Для того, что бы форма была всегда поверх всех окон у формы есть параметр «TopMost» . Для моего примера это выглядело бы так:
Спасибо, за совет, с активной формой уже сам нашел, во правда она все одно по верх запущенного окна powershell ise не выскакивает, но видимо это связанно с тем что окно ise тоже активно так как ждет команду… За стиль отдельно, еще раз спасибо 🙂
нашел на msdn вот такую штуку, она делает окно активным, и соответственно поверх всех, не знаю насколько интересно будет 🙂
$obj_form.Add_Shown({$obj_form.Activate()})
[void]$jbj_form.ShowDialog()
Если решусь продолжать писать статью про форму обязательно напишу. Но обычно мне не нравятся формы которые закрывают часть экрана и не дают ничего с этим делать. Обычно такие формы трояны-вымогатели используют. 🙂
зато эффективно, если убрать кнопки свернуть, закрыть… оставив только ок с нотифаем в сторону админа, что ознакомлены. ни кто потом не скажет, вы не предупредили и из-за вас у меня вся работа рухнула 🙂
Антон, а вот уже чисто академический вопрос, как можно реализовать следующее, не кое окно, где стоит текст, что то вроде «ожидайте идет обработка», а сам скрипт продолжал обрабатываться, вот в таком виде у меня не работает:
[void]$excl_form.ShowDialog()
тут какой то блок кода
$excl_form.Close()
Можете что посоветовать?
Можно на ты, как ни как коллеги. 🙂
как то очень тяжко понимаю «сам скрипт продолжал обрабатываться» и «у меня не работает» 🙂
Так что скажу чтонибудь сумбурное : «закрывать окно по таймеру?» или лучше так: «таймер?» или «System.Threading.Timer».
Я не издеваюсь у меня настроение хорошее… скоро домой 🙂
Поясню.. я не понимаю что не нравится в данном [void]$excl_form.ShowDialog()
тут какой то блок кода
$excl_form.Close()
А! во понял!
запускай «тут какой то блок кода» в событии формы $excl_form. В креэйте например и в конце «тут какой то блок кода» $excl_form.Close()
И всё будет.
пробовал взять тот блок кода внутрь скобок, не отрабатывает….
т.е. выглядит так
[void]$excl_form.ShowDialog( тут идет код. который обрабатывает данные из экселевской таблицы )
$excl_form.Close()
Собственно это не важно, просто хотел, пока идет обработка экселевской таблицы и диалоговые окна не появляются, показывать окно без кнопкой с фразой «Ждите…»
Потом это окно гасить и уже пошли диалоговые….
Пока ждал ответа, назрел еще один вопрос…шерстил в гугле. не нашел…
Вот смотри…создаю форму с текст боксами и расшифровкой рядом, фактически их 10-ть текст боксов все однотипные и отличаются только координатами расположения. думал прогнать циклом ну что бы у каждого текстбокса было уникальное имя
типа $textbox1 = New-Object “System.Windows.Forms.TextBox”
$textbox2= и т.д….Рельно как то реализовать это в цикле, что бы не руками каждый текст бокс создавать?
т.е. авто создание переменной где $textbox -это фактически константа, а цифра к ней просто присоединяется?
да конечно реально, так и делается 🙂
делается массив(например $textbox) и в цикле прогоняется создание объектов с нужными параметрами.
Событие на них вешается одно (например клик мыши) а там смотрится какой объект вызвал данное событие.
Видимо под вечер мозги, да и глаза в кучу, не совсем понял, можешь пояснить на примере?
Т.е. надо создать три текст бокса стоящих друг над другом с дефолтовым значением 0, у любого из них в диалоговом окне мы можем поменять значение. Можем и у всех. При нажатии пимпы ок, все значения трех текстбоксов передаем переменным…
Хотя я наверно понял что ты имеешь ввиду, в массив загоняем эти десять переменных…типа текстбокс1, текстбокс2 и т.д…верно?
да, именно так. текстбокс[1], текстбокс[2] и т.д пример не могу… мне с ребёнком надо играться 🙂 ток завтра…
Здравствуйте, только начинаю разбираться с PowerShell и кодами в целом, хотел поинтересоваться, каким образом можно запустить дальше данные которые вводятся в TextBox. Сделал 2 поля логин и пароль, под ними кнопки Ок и Cancel и хотел, чтобы после ввода данных в поля TextBox1 и TextBox2 при нажатии кнопки ОК, данные сохранялись или передавались в другой файл, а при нажатии кнопки Cancel удалялись, не могу найти решение на просторах интернета. Может плохо ищу. Извините, если вопрос не по теме.
А что должна делать вот эта строка?
$TextBox = $credentials.Password | ConvertFrom-SecureString | Set-Content «C:\Users\IvanMB\Desktop\1.txt»
В итоге в $TextBox будет результат вот этой команды Set-Content «C:\Users\IvanMB\Desktop\1.txt»
данные из текст бокса лежит вот здесь $TextBox.Text. Пример использования:
Ну будет время завтра, все-таки кинь пример…Спасибо за помощь.
Тот пример который ты хотел, скучный при нажатии кнопки визуально ничего не происходит 🙂
Поэтому при нажатии кнопки меняется значения текста в текст-боксах. Я думаю ты с лёгкостью переделаешь этот пример под себя.
Спасибо, правда не понял зачем вот это..
# при нажатии клавиши запускается цикл пробегающий все TextBox`ы
for($i=0; $i -lt $CountTextBox; $i++)
{
# присваиваем тексту текст бокса значение переменной $i
$TextBox[$i].Text = [string]$i
}
}
Как мои вчерашние опыты показали, в отличии от того же выпадающего списка, где подобное нужно, что бы текстовое значение из списка передать дальше в скрипт, после закрытия формы. Значение чек боксов прекрасно доступны и потом. И собственно я их и использовал дальше в скрипте напрямую, как $TextBox[0].Text и т.д.
Еще раз спасибо за пример!.
И вот поэтому можешь подробнее пояснить?
«пробовал взять тот блок кода внутрь скобок, не отрабатывает….
т.е. выглядит так
[void]$excl_form.ShowDialog( тут идет код. который обрабатывает данные из экселевской таблицы )
$excl_form.Close()
Собственно это не важно, просто хотел, пока идет обработка экселевской таблицы и диалоговые окна не появляются, показывать окно без кнопкой с фразой «Ждите…»
Потом это окно гасить и уже пошли диалоговые….»
Чтоб пример написать, скажи а как ты обрабатываеш события? мне просто способ $button.add_Click({Click_Button}); не нравится в msdn написано, что только для внутреннего использования в корпорации 🙂
В общем лан.. буду пользоваться этими костылями.
Вместо татам функцию или код вставить надо.
start-sleep( 10) нужен чтоб форма успела отобразиться нормально.
Тоесть на событие активация формы мы ставим её закрытие, а в событие закрытия вставляем нужный код.
После выполнения кода форма сможет благополучно сама закрыться.
> Спасибо, правда не понял зачем вот это..
> # при нажатии клавиши запускается цикл пробегающий все TextBox
ы
ов> for($i=0; $i -lt $CountTextBox; $i++)
> {
> # присваиваем тексту текст бокса значение переменной $i
> $TextBox[$i].Text = [string]$i
> }
> }
Это просто показать, что кнопка работает. и просто изменяю значение $TextBox
Ну вот такое для выпадающего списка
$button.Add_Click({$selected_der.Text = $dropdown_list.SelectedItem.ToString(); $der_form.Close()})
А такое вот для текст бокса
$button_end.Add_Click({$end_form.Close()})
угу.. я там выше ответил.. 🙂
Да, увидел. Спасибо! Все понятненько 🙂
Очень громоздко и жутко. Вот так надо:
Сохраняем этот xml в файлик
И далее на повершеле:
ВО КАК НАДА
а можно текст xml, для полноты комментария? и текст между тегами <pre></pre> пожалуйста размести, что бы не пропал.
По моему мнению способ с xml удобен, когда у тебя большая форма.
А если ты пишешь скрипт, в котором у тебя на форме один показатель активности, с кнопкой стоп. Это уже не слишком то и надо.
Я так и не начал воспринимать PowerShell как язык программирования. Для меня это средство написать ёмкие консольные приложения. В которых форма это по большей степени исключение, нежели инструмент первой необходимости.
У меня к вам вопрос.
Я создал форму состоящую из определённого количества кнопок, а как мне реализовать открытие других скриптов при нажатии кнопки?(каждая кнопка соответствует определённому скрипту)
Там выше в комментариях вот такая конструкция : «$button.add_Click({Click_Button});» Где вместо Click_Button код который должен выполниться при нажатии кнопки, но мне не нравиться этот метод, т.к. на msdn он указан как для внутреннего использования…
А как правильно я так и не нашёл, как реализовать… Надо вернуться к этому вопросу…
Но как вариант использовать можно?
Да, но возможны проблемы в дальнейшем, при переходе на новые версии Net. Framework`а …. в будущем..
А и ещё вопрос.
За место ({Click_Button}) название скрипта или прям сама строчка кода, которая нужна для выполнения?
Можно прямо между фигурных скобочек код писать, можно вынести код в отдельную функцию и в фигурных скобочках её вызывать.
Пример формы в которой при нажатии кнопки к названию кнопки добавляется текст «1»
А как-то с помощью кода можно при клике сделать открытие файла?
Не понял вопроса.. файл надо открывать чем то %)
Например открытие файла с помощью блокнота C:\1.txt:
Или например смотрим содержимое файла и выводим его содержимео в… консоль…
Спасибо большое вам за помощь.)Спасли меня на практике.)
Дали задание сделать что-то подобное,а я не умею._
Благодаря вам разобрался и научился.)
Пожалуйста. Обращайтесь ещё.
Подскажите, в какой среде кроме PowerShell ISE можно писать код?
кроме Windows PowerShell ISE
есть:
Visual Studio Code
(SAPIEN) PowerShell Studio 2016,PrimalScript2016,
PowerGUI
PowerShell Analyzer
PowerShell Plus
да хоть Notepad++
Но вопрос находится в статье для GUI, поэтому вы наверно хотите услышать про Windows Presentation Foundation который находится в Visul Studio. И с помощью которого можно создавать xml c описанием GUI, которое можно подключить к Power Shell.
Для таких как я «е» -это Академия.Возможно Вы посоветуете использование Windows.Forms используя не только для создания «формы» как таковой,но и к обращению к математической её части.
С признательностью Anatol.
Хотел бы уточнить про «е» это вы про «ё»?
И ещё не совсем понял про математическую часть формы.
У меня есть статья про часть свойств формы http://coolcode.ru/izmenyaem-vneshniy-vid-system-windows-forms-form/.
Вы про такие статьи ?
Я сначала хотел попытаться описать все объекты формы, но из за не достатка времени меня унесло в другие направления. Более интересные людям. Сейчас я пытаюсь разобраться с Arduino. И пишу переводы для CodeCombat детей завлекать во время каникул. 🙂 А то Июнь Июль Август совсем скучно, никто не заходит и ничего не пишут. 🙂
Так что по подробнее что вы хотите увидеть, а лучше напишите статью вы. За одно и научитесь я так и делаю. 🙂
По поводу «ё» Вы совершенно правы, извиняюсь за ошибку. Что касается «математической части», то меня интересуют такие свойства как вычисление sin x и всё такое прочее. PS требует задание аргумента в радианах и пришлось сотворить программку перевода радиан в градусы используя разложение функций в ряд Маклорена. Хотелось бы работать напрямую без всяких разложений во всяческие ряды.
М…. здесь сложный момент… вы явно выбрали не тот инструмент. 🙂
Вам нужен настоящий язык программирования. 🙂
вот вы в командной строке стали бы вычислять sin? … надеюсь это не для генерации логинов AD-шных учёток:)
В любом языке программирования есть своя библиотека Math в какой-нубудь форме.
Не исключение и .NET который можно использовать в PowerShell. И вычисление синуса в PowerShell можно записать так:
Подробнее про библиотеку Math от .NET можно посмотреть здесь
Но повторюсь инструмент явно не тот.
Увы,так называемые настоящие языки программирования, в частности C++ с столь же ущербен, что и PS.Приходилось и там использовать ряд Маклорена. К Вам же огромная просьба: не оставляйте намерение по описанию(желательно с примерами) всех объектов формы. Ваш «ё» удивительно приятное исключение на достаточно сером фоне сведений по созданию форм и внятного описания пространства имён.
С признательностью Anatol/
Вы всегда можете стать автором на этом сайте. И написать данные статьи самостоятельно. 🙂
А я в .net разочаровался… мне будет сложно заставить себя тратить много времени на описание этого… не побоюсь этого слова фреймворка….
Если я и начну описывать, как создавать формы то в первую очередь на QT давно смотрю в сторону данной библиотеки. 🙂
Добрый день!
Написал рекурсивный парсер файлов xml .
Все бы ничего, работает на уровне консоли..
но я решил написать гуишку для вывода и незадача
Код парсера
$path=get-childitem -dir
gci $path -recurse
-include *.xml
| Foreach {
$file = $_;
$f_path=$file.DirectoryName +»\»+ $file.Name
}
#——————reading xml files————————————
[xml]$xmlfile = Get-Content $f_path | foreach($xmluser in $xmlfile.счетапк.открытиесчетов.сотрудник) {
Write-Host $xmluser.син ‘|’ $xmluser.фамилия $xmluser.имя $xmluser.отчество ‘|’ $xmluser.ОтделениеБанка ‘|’ $xmluser.ФилиалОтделенияБанка ‘|’ $f_name
}
Часть GUI
$Label = New-Object System.Windows.Forms.Label
$Label.Text = $_____????______ <- что тут присвоить, я не могу понять
$Label.Location = New-Object System.Drawing.Point(0,10)
$Label.AutoSize = $true
$main_form.Controls.Add($Label)
вот я и не знаю, как прицепить $xmlfile или цикл foreach к переменной $label.text
Возможно можно использовать текстбокс с мультилайном…
Ответил на форуме:
http://coolcode.ru/forums/topic/gui-dlya-rekursivnogo-parsera-faylov-xml/#post-8992