Update install-AdHoc-Backup-GUI.ps1
This commit is contained in:
parent
68f530e72f
commit
f4ffd9a66c
@ -1,16 +1,18 @@
|
||||
#Requires -Version 5.1
|
||||
<#
|
||||
Installer AdHoc Backup (GUI) - v1.3.5
|
||||
- Fix: editing nel tab Config -> niente più "indice null" (usa $sender.Tag per mappare il key)
|
||||
- Solo 7zr.exe (nessun alias 7z.exe) in C:\polo\scripts\bin\7Zip\
|
||||
- Rclone auto, pulizia ZIP, layout bin/conf
|
||||
- Schedulazione via schtasks, chiusura console figlie
|
||||
Installer AdHoc Backup (GUI) - v1.3.8
|
||||
- FIX definitivo accenti in GUI su PowerShell 5.1: questo file è salvato in UTF-8 **con BOM**
|
||||
- Mantiene: font Segoe UI, UseCompatibleTextRendering, auto-detect encoding per backup.conf, salvataggio UTF-8 no BOM
|
||||
- Solo 7zr.exe, install di Rclone & 7zr su "Installa", layout bin/conf, schedulazione, chiusura processi figli
|
||||
#>
|
||||
|
||||
Add-Type -AssemblyName System.Windows.Forms
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
# Abilita stile moderno WinForms
|
||||
[System.Windows.Forms.Application]::EnableVisualStyles()
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
# ------------------------------ HELPERS GRAFICI -------------------------------
|
||||
@ -19,6 +21,18 @@ function New-Size([object]$w,[object]$h) { try { return New-Object System.Drawin
|
||||
function Set-Loc($ctrl,[object]$x,[object]$y){ $ctrl.Location = New-Point $x $y }
|
||||
function Set-Sz($ctrl,[object]$w,[object]$h){ $ctrl.Size = New-Size $w $h }
|
||||
|
||||
# Abilita rendering compatibile (GDI+) su etichette/pulsanti/checkbox ecc.
|
||||
function Enable-TextRendering($container){
|
||||
foreach($c in $container.Controls){
|
||||
if ($c -and ($c.PSObject.Properties['UseCompatibleTextRendering'])){
|
||||
$c.UseCompatibleTextRendering = $true
|
||||
}
|
||||
if ($c.Controls -and $c.Controls.Count -gt 0){
|
||||
Enable-TextRendering $c
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ------------------------------ LOG -------------------------------------------
|
||||
function New-LogTimestamp { (Get-Date).ToString('yyyy-MM-dd HH:mm:ss') }
|
||||
$global:LogFile = $null
|
||||
@ -51,7 +65,7 @@ function Start-Download {
|
||||
}
|
||||
}
|
||||
|
||||
# Estrattore ZIP robusto (overwrite = true) senza usare overload con Encoding
|
||||
# Estrattore ZIP robusto (overwrite = true)
|
||||
function Expand-Zip {
|
||||
param([Parameter(Mandatory)][string]$ZipPath,[Parameter(Mandatory)][string]$DestDir)
|
||||
Write-Log "Estrazione ZIP: $ZipPath -> $DestDir"
|
||||
@ -152,11 +166,40 @@ $global:ConfUi = @{
|
||||
function Is-BoolString([string]$s){ if ($null -eq $s) { return $false }
|
||||
switch ($s.Trim().ToLowerInvariant()) { 'true' {1};'false' {1};'1' {1};'0' {1};'yes' {1};'no' {1};'y' {1};'n' {1}; default {0} } }
|
||||
|
||||
# Auto-detect encoding (UTF-8/UTF-16/ANSI). Preferisce UTF-8, ma cade su ANSI se necessario.
|
||||
function Read-FileAuto {
|
||||
param([Parameter(Mandatory)][string]$Path)
|
||||
$bytes = [System.IO.File]::ReadAllBytes($Path)
|
||||
if ($bytes.Length -ge 3 -and $bytes[0] -eq 0xEF -and $bytes[1] -eq 0xBB -and $bytes[2] -eq 0xBF) {
|
||||
$text = [System.Text.Encoding]::UTF8.GetString($bytes,3,$bytes.Length-3)
|
||||
} elseif ($bytes.Length -ge 2 -and $bytes[0] -eq 0xFF -and $bytes[1] -eq 0xFE) {
|
||||
$enc = [System.Text.Encoding]::Unicode
|
||||
$text = $enc.GetString($bytes,2,$bytes.Length-2)
|
||||
} elseif ($bytes.Length -ge 2 -and $bytes[0] -eq 0xFE -and $bytes[1] -eq 0xFF) {
|
||||
$enc = [System.Text.Encoding]::BigEndianUnicode
|
||||
$text = $enc.GetString($bytes,2,$bytes.Length-2)
|
||||
} else {
|
||||
$utf8Strict = New-Object System.Text.UTF8Encoding($false,$true)
|
||||
try {
|
||||
$text = $utf8Strict.GetString($bytes)
|
||||
} catch {
|
||||
$text = [System.Text.Encoding]::Default.GetString($bytes)
|
||||
}
|
||||
if ($text -match ([char]0xFFFD)) { # carattere di sostituzione presente => probabile encoding errato
|
||||
$alt = [System.Text.Encoding]::Default.GetString($bytes)
|
||||
$count1 = ($text.ToCharArray() | Where-Object { $_ -eq [char]0xFFFD }).Count
|
||||
$count2 = ($alt.ToCharArray() | Where-Object { $_ -eq [char]0xFFFD }).Count
|
||||
if ($count2 -lt $count1) { $text = $alt }
|
||||
}
|
||||
}
|
||||
return $text -split "`r?`n"
|
||||
}
|
||||
|
||||
function Parse-BackupConf {
|
||||
param([Parameter(Mandatory)][string]$Path)
|
||||
$order = New-Object System.Collections.ArrayList
|
||||
$map = [ordered]@{}
|
||||
$lines = Get-Content -LiteralPath $Path -ErrorAction Stop
|
||||
$lines = Read-FileAuto -Path $Path
|
||||
foreach ($line in $lines) {
|
||||
$trim = $line.Trim()
|
||||
if ($trim -eq '' -or $trim.StartsWith('#') -or $trim.StartsWith(';')) { [void]$order.Add(@{type='comment';text=$line}); continue }
|
||||
@ -182,7 +225,9 @@ function Save-BackupConf { param([Parameter(Mandatory)][string]$Path)
|
||||
foreach ($k in $global:ConfUi.Map.Keys){
|
||||
if (-not ($global:ConfUi.Order | Where-Object { $_.type -eq 'kv' -and $_.key -eq $k })) { $out.Add("$k=$($global:ConfUi.Map[$k])") }
|
||||
}
|
||||
Set-Content -LiteralPath $Path -Value $out -Encoding UTF8
|
||||
# UTF-8 no BOM
|
||||
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
|
||||
[System.IO.File]::WriteAllLines($Path, $out, $utf8NoBom)
|
||||
}
|
||||
|
||||
# ------------------------------ DEFAULTS --------------------------------------
|
||||
@ -196,53 +241,55 @@ $form.Text = 'Installer AdHoc Backup'
|
||||
$form.StartPosition = 'CenterScreen'
|
||||
$form.MaximizeBox = $true
|
||||
$form.FormBorderStyle = 'FixedDialog'
|
||||
# Font globale moderno con pieno supporto accenti
|
||||
$form.Font = New-Object System.Drawing.Font('Segoe UI', 9)
|
||||
Set-Sz $form 900 860
|
||||
|
||||
# Install path
|
||||
$lblInstall = New-Object System.Windows.Forms.Label
|
||||
$lblInstall.Text = 'Cartella di installazione'; Set-Loc $lblInstall 10 12; Set-Sz $lblInstall 180 20; $form.Controls.Add($lblInstall)
|
||||
$lblInstall.Text = 'Cartella di installazione'; Set-Loc $lblInstall 10 12; Set-Sz $lblInstall 200 20; $form.Controls.Add($lblInstall)
|
||||
|
||||
$txtInstall = New-Object System.Windows.Forms.TextBox
|
||||
Set-Loc $txtInstall 10 32; Set-Sz $txtInstall 760 22; $txtInstall.Text = $defaultInstall; $form.Controls.Add($txtInstall)
|
||||
Set-Loc $txtInstall 10 32; Set-Sz $txtInstall 760 24; $txtInstall.Text = $defaultInstall; $form.Controls.Add($txtInstall)
|
||||
|
||||
$btnBrowse = New-Object System.Windows.Forms.Button
|
||||
$btnBrowse.Text = 'Scegli...'; Set-Loc $btnBrowse 780 30; Set-Sz $btnBrowse 90 26; $form.Controls.Add($btnBrowse)
|
||||
$btnBrowse.Text = 'Scegli...'; Set-Loc $btnBrowse 780 30; Set-Sz $btnBrowse 90 28; $form.Controls.Add($btnBrowse)
|
||||
|
||||
# URLs
|
||||
$lblScriptUrl = New-Object System.Windows.Forms.Label; $lblScriptUrl.Text = 'Script URL'; Set-Loc $lblScriptUrl 10 64; Set-Sz $lblScriptUrl 150 20; $form.Controls.Add($lblScriptUrl)
|
||||
$txtScriptUrl = New-Object System.Windows.Forms.TextBox; Set-Loc $txtScriptUrl 10 84; Set-Sz $txtScriptUrl 860 22; $txtScriptUrl.Text = $defaultScriptUrl; $form.Controls.Add($txtScriptUrl)
|
||||
$lblScriptUrl = New-Object System.Windows.Forms.Label; $lblScriptUrl.Text = 'Script URL'; Set-Loc $lblScriptUrl 10 64; Set-Sz $lblScriptUrl 150 22; $form.Controls.Add($lblScriptUrl)
|
||||
$txtScriptUrl = New-Object System.Windows.Forms.TextBox; Set-Loc $txtScriptUrl 10 84; Set-Sz $txtScriptUrl 860 24; $txtScriptUrl.Text = $defaultScriptUrl; $form.Controls.Add($txtScriptUrl)
|
||||
|
||||
$lblConfUrl = New-Object System.Windows.Forms.Label; $lblConfUrl.Text = 'Config URL'; Set-Loc $lblConfUrl 10 116; Set-Sz $lblConfUrl 150 20; $form.Controls.Add($lblConfUrl)
|
||||
$txtConfUrl = New-Object System.Windows.Forms.TextBox; Set-Loc $txtConfUrl 10 136; Set-Sz $txtConfUrl 860 22; $txtConfUrl.Text = $defaultConfUrl; $form.Controls.Add($txtConfUrl)
|
||||
$lblConfUrl = New-Object System.Windows.Forms.Label; $lblConfUrl.Text = 'Config URL'; Set-Loc $lblConfUrl 10 116; Set-Sz $lblConfUrl 150 22; $form.Controls.Add($lblConfUrl)
|
||||
$txtConfUrl = New-Object System.Windows.Forms.TextBox; Set-Loc $txtConfUrl 10 136; Set-Sz $txtConfUrl 860 24; $txtConfUrl.Text = $defaultConfUrl; $form.Controls.Add($txtConfUrl)
|
||||
|
||||
# Opzioni
|
||||
$grpOptions = New-Object System.Windows.Forms.GroupBox; $grpOptions.Text = 'Opzioni'; Set-Loc $grpOptions 10 170; Set-Sz $grpOptions 340 120; $form.Controls.Add($grpOptions)
|
||||
$chkForceConf = New-Object System.Windows.Forms.CheckBox; $chkForceConf.Text='Sovrascrivi config esistente (ForceConfig)'; Set-Loc $chkForceConf 10 20; Set-Sz $chkForceConf 300 22; $grpOptions.Controls.Add($chkForceConf)
|
||||
$chkNoRun = New-Object System.Windows.Forms.CheckBox; $chkNoRun.Text='Non avviare il backup ora (NoRun)'; Set-Loc $chkNoRun 10 45; Set-Sz $chkNoRun 280 22; $grpOptions.Controls.Add($chkNoRun)
|
||||
$chkQuiet = New-Object System.Windows.Forms.CheckBox; $chkQuiet.Text='Modalità silenziosa (Quiet)'; Set-Loc $chkQuiet 10 70; Set-Sz $chkQuiet 220 22; $grpOptions.Controls.Add($chkQuiet)
|
||||
$chkForceConf = New-Object System.Windows.Forms.CheckBox; $chkForceConf.Text='Sovrascrivi config esistente (ForceConfig)'; Set-Loc $chkForceConf 10 20; Set-Sz $chkForceConf 300 24; $grpOptions.Controls.Add($chkForceConf)
|
||||
$chkNoRun = New-Object System.Windows.Forms.CheckBox; $chkNoRun.Text='Non avviare il backup ora (NoRun)'; Set-Loc $chkNoRun 10 45; Set-Sz $chkNoRun 300 24; $grpOptions.Controls.Add($chkNoRun)
|
||||
$chkQuiet = New-Object System.Windows.Forms.CheckBox; $chkQuiet.Text='Modalità silenziosa (Quiet)'; Set-Loc $chkQuiet 10 70; Set-Sz $chkQuiet 300 24; $grpOptions.Controls.Add($chkQuiet)
|
||||
|
||||
# Schedulazione
|
||||
$grpSched = New-Object System.Windows.Forms.GroupBox; $grpSched.Text='Schedulazione'; Set-Loc $grpSched 360 170; Set-Sz $grpSched 510 160; $form.Controls.Add($grpSched)
|
||||
$chkSchedule = New-Object System.Windows.Forms.CheckBox; $chkSchedule.Text='Crea attività pianificata'; Set-Loc $chkSchedule 10 20; Set-Sz $chkSchedule 200 22; $chkSchedule.Checked=$true; $grpSched.Controls.Add($chkSchedule)
|
||||
$lblFreq = New-Object System.Windows.Forms.Label; $lblFreq.Text='Frequenza:'; Set-Loc $lblFreq 20 50; Set-Sz $lblFreq 80 22; $grpSched.Controls.Add($lblFreq)
|
||||
$cmbFreq = New-Object System.Windows.Forms.ComboBox; $cmbFreq.DropDownStyle='DropDownList'; [void]$cmbFreq.Items.Add('Giornaliera'); [void]$cmbFreq.Items.Add('Settimanale'); $cmbFreq.SelectedIndex=0; Set-Loc $cmbFreq 100 48; Set-Sz $cmbFreq 120 22; $grpSched.Controls.Add($cmbFreq)
|
||||
$lblDOW = New-Object System.Windows.Forms.Label; $lblDOW.Text='Giorno:'; Set-Loc $lblDOW 240 50; Set-Sz $lblDOW 60 22; $grpSched.Controls.Add($lblDOW)
|
||||
$chkSchedule = New-Object System.Windows.Forms.CheckBox; $chkSchedule.Text='Crea attività pianificata'; Set-Loc $chkSchedule 10 20; Set-Sz $chkSchedule 220 24; $chkSchedule.Checked=$true; $grpSched.Controls.Add($chkSchedule)
|
||||
$lblFreq = New-Object System.Windows.Forms.Label; $lblFreq.Text='Frequenza:'; Set-Loc $lblFreq 20 50; Set-Sz $lblFreq 80 24; $grpSched.Controls.Add($lblFreq)
|
||||
$cmbFreq = New-Object System.Windows.Forms.ComboBox; $cmbFreq.DropDownStyle='DropDownList'; [void]$cmbFreq.Items.Add('Giornaliera'); [void]$cmbFreq.Items.Add('Settimanale'); $cmbFreq.SelectedIndex=0; Set-Loc $cmbFreq 100 48; Set-Sz $cmbFreq 120 24; $grpSched.Controls.Add($cmbFreq)
|
||||
$lblDOW = New-Object System.Windows.Forms.Label; $lblDOW.Text='Giorno:'; Set-Loc $lblDOW 240 50; Set-Sz $lblDOW 60 24; $grpSched.Controls.Add($lblDOW)
|
||||
$cmbDOW = New-Object System.Windows.Forms.ComboBox; $cmbDOW.DropDownStyle='DropDownList'
|
||||
'Lunedì (MON)','Martedì (TUE)','Mercoledì (WED)','Giovedì (THU)','Venerdì (FRI)','Sabato (SAT)','Domenica (SUN)' | ForEach-Object { [void]$cmbDOW.Items.Add($_) }
|
||||
$cmbDOW.SelectedIndex=0; Set-Loc $cmbDOW 300 48; Set-Sz $cmbDOW 180 22; $cmbDOW.Enabled=$false; $grpSched.Controls.Add($cmbDOW)
|
||||
$cmbDOW.SelectedIndex=0; Set-Loc $cmbDOW 300 48; Set-Sz $cmbDOW 180 24; $cmbDOW.Enabled=$false; $grpSched.Controls.Add($cmbDOW)
|
||||
$cmbFreq.Add_SelectedIndexChanged({ $cmbDOW.Enabled = ($cmbFreq.SelectedIndex -eq 1) })
|
||||
|
||||
$lblTime = New-Object System.Windows.Forms.Label; $lblTime.Text='Ora:'; Set-Loc $lblTime 20 85; Set-Sz $lblTime 40 22; $grpSched.Controls.Add($lblTime)
|
||||
$lblTime = New-Object System.Windows.Forms.Label; $lblTime.Text='Ora:'; Set-Loc $lblTime 20 85; Set-Sz $lblTime 40 24; $grpSched.Controls.Add($lblTime)
|
||||
$timePicker = New-Object System.Windows.Forms.DateTimePicker; $timePicker.Format=[System.Windows.Forms.DateTimePickerFormat]::Time; $timePicker.ShowUpDown=$true
|
||||
$tpDefault = Get-Date; $tpDefault = Get-Date -Hour 23 -Minute 0 -Second 0
|
||||
$timePicker.Value = $tpDefault; Set-Loc $timePicker 60 82; Set-Sz $timePicker 100 22; $grpSched.Controls.Add($timePicker)
|
||||
$timePicker.Value = $tpDefault; Set-Loc $timePicker 60 82; Set-Sz $timePicker 100 24; $grpSched.Controls.Add($timePicker)
|
||||
|
||||
$lblTask = New-Object System.Windows.Forms.Label; $lblTask.Text='Nome task:'; Set-Loc $lblTask 180 85; Set-Sz $lblTask 80 22; $grpSched.Controls.Add($lblTask)
|
||||
$txtTask = New-Object System.Windows.Forms.TextBox; Set-Loc $txtTask 260 82; Set-Sz $txtTask 230 22; $txtTask.Text='Backup_AdHoc'; $grpSched.Controls.Add($txtTask)
|
||||
$lblTask = New-Object System.Windows.Forms.Label; $lblTask.Text='Nome task:'; Set-Loc $lblTask 180 85; Set-Sz $lblTask 80 24; $grpSched.Controls.Add($lblTask)
|
||||
$txtTask = New-Object System.Windows.Forms.TextBox; Set-Loc $txtTask 260 82; Set-Sz $txtTask 230 24; $txtTask.Text='Backup_AdHoc'; $grpSched.Controls.Add($txtTask)
|
||||
|
||||
# Argomenti extra
|
||||
$lblExtra = New-Object System.Windows.Forms.Label; $lblExtra.Text='Argomenti extra per AdHoc (es. -WhatIf)'; Set-Loc $lblExtra 10 340; Set-Sz $lblExtra 380 20; $form.Controls.Add($lblExtra)
|
||||
$txtExtra = New-Object System.Windows.Forms.TextBox; Set-Loc $txtExtra 10 362; Set-Sz $txtExtra 860 22; $form.Controls.Add($txtExtra)
|
||||
$lblExtra = New-Object System.Windows.Forms.Label; $lblExtra.Text='Argomenti extra per AdHoc (es. -WhatIf)'; Set-Loc $lblExtra 10 340; Set-Sz $lblExtra 420 22; $form.Controls.Add($lblExtra)
|
||||
$txtExtra = New-Object System.Windows.Forms.TextBox; Set-Loc $txtExtra 10 362; Set-Sz $txtExtra 860 24; $form.Controls.Add($txtExtra)
|
||||
|
||||
# ------------------------------ TAB: CONFIGURAZIONE ---------------------------
|
||||
$tabs = New-Object System.Windows.Forms.TabControl; Set-Loc $tabs 10 392; Set-Sz $tabs 860 230; $form.Controls.Add($tabs)
|
||||
@ -250,15 +297,15 @@ $tabConfig = New-Object System.Windows.Forms.TabPage; $tabConfig.Text='Configura
|
||||
|
||||
$cfgPanel = New-Object System.Windows.Forms.Panel; Set-Loc $cfgPanel 10 10; Set-Sz $cfgPanel 830 150; $cfgPanel.AutoScroll=$true; $tabConfig.Controls.Add($cfgPanel)
|
||||
|
||||
$btnReloadConf = New-Object System.Windows.Forms.Button; $btnReloadConf.Text='Ricarica da URL'; Set-Loc $btnReloadConf 10 170; Set-Sz $btnReloadConf 120 26; $tabConfig.Controls.Add($btnReloadConf)
|
||||
$btnSaveConf = New-Object System.Windows.Forms.Button; $btnSaveConf.Text='Salva in bin\\conf'; Set-Loc $btnSaveConf 140 170; Set-Sz $btnSaveConf 230 26; $tabConfig.Controls.Add($btnSaveConf)
|
||||
$btnRcloneConfig = New-Object System.Windows.Forms.Button; $btnRcloneConfig.Text='Configura rclone (console)'; Set-Loc $btnRcloneConfig 380 170; Set-Sz $btnRcloneConfig 170 26; $tabConfig.Controls.Add($btnRcloneConfig)
|
||||
$btnReloadConf = New-Object System.Windows.Forms.Button; $btnReloadConf.Text='Ricarica da URL'; Set-Loc $btnReloadConf 10 170; Set-Sz $btnReloadConf 140 28; $tabConfig.Controls.Add($btnReloadConf)
|
||||
$btnSaveConf = New-Object System.Windows.Forms.Button; $btnSaveConf.Text='Salva in bin\\conf'; Set-Loc $btnSaveConf 160 170; Set-Sz $btnSaveConf 230 28; $tabConfig.Controls.Add($btnSaveConf)
|
||||
$btnRcloneConfig = New-Object System.Windows.Forms.Button; $btnRcloneConfig.Text='Configura rclone (console)'; Set-Loc $btnRcloneConfig 400 170; Set-Sz $btnRcloneConfig 200 28; $tabConfig.Controls.Add($btnRcloneConfig)
|
||||
|
||||
function Build-ConfigUI {
|
||||
$cfgPanel.Controls.Clear(); $global:ConfUi.Controls = @{}
|
||||
$xLabel=10; $xCtrl=260; $y=10; $h=24
|
||||
foreach ($k in $global:ConfUi.Map.Keys) {
|
||||
$key = [string]$k # copia locale e forte tipizzazione
|
||||
$key = [string]$k
|
||||
$v = $global:ConfUi.Map[$key]
|
||||
$lbl = New-Object System.Windows.Forms.Label; $lbl.Text=$key; $lbl.Tag=$key; Set-Loc $lbl $xLabel ($y+4); Set-Sz $lbl 240 $h; $cfgPanel.Controls.Add($lbl)
|
||||
if (Is-BoolString $v) {
|
||||
@ -291,6 +338,7 @@ function Build-ConfigUI {
|
||||
}
|
||||
$y += 28
|
||||
}
|
||||
Enable-TextRendering $cfgPanel
|
||||
}
|
||||
|
||||
$btnReloadConf.Add_Click({
|
||||
@ -318,17 +366,17 @@ $btnRcloneConfig.Add_Click({
|
||||
$rcloneExe = Ensure-RcloneExe -RcloneDir $layout.RClone
|
||||
$rcloneConf = Join-Path $layout.Conf 'rclone.conf'
|
||||
$p = Start-Process -FilePath $rcloneExe -ArgumentList @('config','--config', $rcloneConf) -WorkingDirectory $layout.RClone -PassThru
|
||||
Track-Child $p
|
||||
[void]$global:ChildPids.Add($p.Id)
|
||||
Write-Log "Avviato rclone config (PID=$($p.Id))"
|
||||
} catch { Write-Log "Errore avvio rclone config: $($_.Exception.Message)" 'ERR' }
|
||||
})
|
||||
|
||||
# ------------------------------ BOTTONI AZIONE --------------------------------
|
||||
$btnInstall = New-Object System.Windows.Forms.Button; $btnInstall.Text='Installa'; Set-Loc $btnInstall 10 652; Set-Sz $btnInstall 120 30; $form.Controls.Add($btnInstall)
|
||||
$btnClose = New-Object System.Windows.Forms.Button; $btnClose.Text='Chiudi'; Set-Loc $btnClose 150 652; Set-Sz $btnClose 120 30; $form.Controls.Add($btnClose)
|
||||
$btnInstall = New-Object System.Windows.Forms.Button; $btnInstall.Text='Installa'; Set-Loc $btnInstall 10 652; Set-Sz $btnInstall 120 32; $form.Controls.Add($btnInstall)
|
||||
$btnClose = New-Object System.Windows.Forms.Button; $btnClose.Text='Chiudi'; Set-Loc $btnClose 150 652; Set-Sz $btnClose 120 32; $form.Controls.Add($btnClose)
|
||||
|
||||
# LOG
|
||||
$lblLog = New-Object System.Windows.Forms.Label; $lblLog.Text='Log'; Set-Loc $lblLog 10 692; Set-Sz $lblLog 50 20; $form.Controls.Add($lblLog)
|
||||
$lblLog = New-Object System.Windows.Forms.Label; $lblLog.Text='Log'; Set-Loc $lblLog 10 692; Set-Sz $lblLog 50 22; $form.Controls.Add($lblLog)
|
||||
$txtLog = New-Object System.Windows.Forms.TextBox; Set-Loc $txtLog 10 712; Set-Sz $txtLog 860 100; $txtLog.Multiline=$true; $txtLog.ScrollBars='Vertical'; $txtLog.ReadOnly=$true; $form.Controls.Add($txtLog); $global:LogTextBox = $txtLog
|
||||
|
||||
# ------------------------------ HANDLERS --------------------------------------
|
||||
@ -369,7 +417,7 @@ $btnInstall.Add_Click({
|
||||
$args=@('-NoProfile','-ExecutionPolicy','Bypass','-File',"`"$scriptPath`"","-Config", "`"$confPath`"")
|
||||
if ($chkQuiet.Checked){ $args += '-Quiet' }
|
||||
if ($txtExtra.Text -and $txtExtra.Text.Trim() -ne ''){ $args += $txtExtra.Text.Trim().Split(' ') }
|
||||
$p=Start-Process -FilePath 'powershell.exe' -ArgumentList $args -PassThru; Track-Child $p; Write-Log "Esecuzione avviata (PID=$($p.Id))."
|
||||
$p=Start-Process -FilePath 'powershell.exe' -ArgumentList $args -PassThru; [void]$global:ChildPids.Add($p.Id); Write-Log "Esecuzione avviata (PID=$($p.Id))."
|
||||
}
|
||||
|
||||
Write-Log "Installazione completata."
|
||||
@ -379,7 +427,7 @@ $btnInstall.Add_Click({
|
||||
|
||||
$btnClose.Add_Click({ $form.Close() })
|
||||
|
||||
# Evita conflitto con variabile automatica $PID
|
||||
# Chiudi eventuali processi figli avviati dalla GUI
|
||||
$form.Add_FormClosed({
|
||||
foreach ($cpid in $global:ChildPids) {
|
||||
try {
|
||||
@ -403,4 +451,7 @@ try {
|
||||
else { Write-Log "Non sono riuscito a scaricare il backup.conf iniziale." 'WARN' }
|
||||
} catch { Write-Log "Errore iniziale confer: $($_.Exception.Message)" 'ERR' }
|
||||
|
||||
# Applica rendering compatibile a tutta la finestra
|
||||
Enable-TextRendering $form
|
||||
|
||||
[void]$form.ShowDialog()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user