Меню на 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
От советов не откажусь как мне лучше поступить в данных ситуациях. Как закончу допишу что получилось и какие мучения были по пути.