7

Меню на Powershell для установки ПО.

Hello Wordl!


Не так давно я влился в новый для себя коллектив и резко поменял направление в IT для себя.

По этому теперь я осваиваю powershell как первый свой "язык программирования" (на счет этого у меня немного другое мнение)


Я уже написал несколько скриптов на работе или поправлял работы коллег, но дома довожу их до ума.

Первый мой скрипт которым я занялся и продолжаю доводить до ума это банальная установка ПО, им я и хочу поделиться. Просто поделиться и все =) (ну и совета получить).


Скрипт сам по себе тривиален:  Start-Process -FilePath .......

Но я реши заморочится с интерфейсом установки.


Рабочий скрипт на работе выглядел как отдельное вплывающее окно в котором нужно ввести цифру и скрипт пошел.

Я же захотел "чекбоксов" и "радиобаттонов" и тут у меня начались проблемы растянувшиеся на неделю.


Проблема 1: Не совсем представлял что хотел получить в итоге.

Проблема 2: Мало опыта. Мало информации (из за неумения адекватно искать).

Проблема 3: Получил не то что хотел и начал все по новой (хождение по мукам).


После получения информации как прикрутить "радиобаттон" начались проблемы.

Я не знал какой командой прикрутить выходные данные к кнопке "OK", бы скрипт запускал функцию установки Putty_x32 и Putty_x64 (при выборе нужного естественно).


Пытался извратиться следующей командой:

$Rbutton1.Controls.Add_click({putty32})


function putty32 {
copy-item $......

start-process...}


Было еще множество глупых попыток объявить глобальную переменную $wow = 0

и в add_click() уже добавить значение 1 или 2, а потом из полученной переменной с помощью if elseif делать логику.


Выглядело это извращение примерно так:

Я даже пытался логику прописывать в сам .Add.click({if (...)}), что даже на каком то этапе работало, но не давало выбора.


Это было явно не то чего я хотел, но как бы я не старался получалось как на картинке "превозмогая трудности".


После долгих мучений я нашел несколько примеров как НУЖНО делать.

Все оказалось проще некуда, просто нужно знать или примерно помнить эти команды.


Итогом получилось:

Супер! - Подумал я и быстро поискав информацию написал простенькую логику к кнопкам "Ok" и "Cancel".

Ну собственно и обделался тут же.


Код работал. Необходимые функции запускал, но при нажатии кнопки "Cancel" или закрытия окна, запускался скрипт установки.

1.5 дня я потратил что бы понять где я горе программист очередной раз сел в лужу и нашел.

Я просто не прописал логику нормально с отсылкой на кнопку "Ok".


Готовый код:


$downloadfile_x32 = "D:\Distr\Putty\putty-0.73-installer.msi"
$downloadfile_x64 = "D:\Distr\Putty\putty-64bit-0.73-installer.msi"
$SettingProgramm_x32 = "C:\Temp\putty-0.73-installer.msi"
$SettingProgramm_x64 = "C:\Temp\putty-64bit-0.73-installer.msi"
$Share = "C:\Temp"
#=====Начало меню=====#
Add-Type -Assembly system.windows.forms # класс для графического GUI
$window_form = New-Object System.Windows.Forms.Form #создание самого окна
$window_form.Text = "Установка Putty" #заголовок окна
$window_form.Width = 350 #ширина
$window_form.Height = 180 #высота
$window_form.AutoScale = $true #автоматическое растягивание по тексту
$pLabel = New-Object System.windows.forms.Label
$pLabel.Location = New-Object System.Drawing.Point (8,10) #отступ слева #Отступ сверху
$pLabel.Size = New-Object System.Drawing.Size (140, 15)
$pLabel.Text = "Версия для установки : "
$window_form.Controls.Add($pLabel)
$RadioButton1 = New-Object System.Windows.Forms.RadioButton
$RadioButton1.Location = '20,40' #отступ слева/отступ сверху
$RadioButton1.size = '100,20' #длина и ширина отображаемой надписи
$RadioButton1.Checked = $true
$RadioButton1.Text = "Putty_x32"
$window_form.Controls.Add($RadioButton1)
$RadioButton2 = New-Object System.Windows.Forms.RadioButton
$RadioButton2.Location = '140,40'
$RadioButton2.size = '100,20'
$RadioButton2.Checked = $false
$RadioButton2.Text = "Putty_x64"
$window_form.Controls.Add($RadioButton2)
#кнопка OK.
$OKButton = new-object System.Windows.Forms.Button
$OKButton.Location = '30,90'
$OKButton.Size = '70,25'
$OKButton.Text = 'OK'
$OKButton.DialogResult=[System.Windows.Forms.DialogResult]::OK
$window_form.Controls.Add($OKButton)
#Кнопка закрытия меню.
$CancelButton = new-object System.Windows.Forms.Button
$CancelButton.Location = new-object System.Drawing.Size(110,90)
$CancelButton.Size = new-object System.Drawing.Size(70,25)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$window_form.Close()})
$window_form.Controls.Add($CancelButton)
$buttondialoge = $window_form.ShowDialog()

#=====Конец меню=====#

#----------Логика----------#
if ($buttondialoge -eq "OK") {
if ($RadioButton1.Checked)
{putty32}
elseif ($RadioButton2.Checked)
{putty64}
else
{exit}
}
#----------конец логики----------#

###установка x32###
function putty32 {
Copy-Item -Path $downloadfile_x32 -Destination $Share -Force
"Ready..."
Start-Process -FilePath $SettingProgramm_x32
}
###Установка x64###
function putty64 {
Copy-Item -Path $downloadfile_x64 -Destination $Share -Force
"Ready..."
Start-Process -FilePath $SettingProgramm_x64
}

Спустя набитые шишки на пути новичка, я планирую доделать установочную часть скрипта.

Для завершения мне нужно сделать "тихую" установку программ через запись файла автоответа.

Пару раз попытавшись провернуть это по мануалу через cmd у меня как то не вышло. Буду пробовать еще.


Так же есть недочет в удалении файла из TEMP стандартный Remove-item отказывается удалять даже через -Force

-Recurce в данном случае не имеет смысла подключать, иначе можно бахнуть все файлы в Temp (а задачи такой нет).

Вариант "Get-ChildItem -Path $SettingProgramm_x64 -File -Recurse | Remove-Item " - Грохает файл сразу после его добавления в Temp. Вывод его за функцию не помогает.

По этому я смотрю на применение stat-job и recive-job



От советов не откажусь как мне лучше поступить в данных ситуациях. Как закончу допишу что получилось и какие мучения были по пути.

1
Автор поста оценил этот комментарий
1) у msi есть ключи для автоустановки в silent режиме. См msiexec /?
2) у msiexec есть так называемые файлы трансоформации для msi файлов - mst. Их можно создавать самому.
3) рекомендую писать интерфейс на XAML.

и если это для работы, то не проще разворачивать ПО через gpo?
а битность системы , если это важно, можно определять через wmi фильтры.

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества