diff --git a/install-AdHoc-Backup-GUI.ps1 b/install-AdHoc-Backup-GUI.ps1 index ac7368d..b529384 100644 --- a/install-AdHoc-Backup-GUI.ps1 +++ b/install-AdHoc-Backup-GUI.ps1 @@ -1,14 +1,10 @@ #Requires -Version 5.1 <# -Installer AdHoc Backup (GUI) - v1.3.4 -- Tab "Configurazione (backup.conf)" con UI dinamica (checkbox per booleani, textbox per altri valori) -- Struttura: C:\polo\scripts\bin\RClone\ C:\polo\scripts\bin\7Zip\ C:\polo\scripts\bin\conf\ -- Config: C:\polo\scripts\bin\conf\backup.conf e C:\polo\scripts\bin\conf\rclone.conf -- "Installa": scarica/installa Rclone e **solo 7zr.exe** (nessun alias 7z.exe) nelle cartelle bin\ -- Dopo estrazione elimina ZIP di Rclone -- Avvio "Configura rclone" con Start-Process diretto (no cmd.exe) -- Schedulazione giornaliera/settimanale via schtasks; AdHoc-Backup.ps1 avviato con -Config -- Chiusura di tutte le console aperte dall’installer alla chiusura della finestra +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 #> Add-Type -AssemblyName System.Windows.Forms @@ -146,7 +142,7 @@ $global:ChildPids = New-Object System.Collections.ArrayList function Track-Child($p){ if ($p -and $p.Id) { [void]$global:ChildPids.Add($p.Id) } } $global:ConfUi = @{ - Map = $null + Map = [ordered]@{} Order = @() Controls = @{} SourceLines = @() @@ -174,6 +170,7 @@ function Parse-BackupConf { } function Save-BackupConf { param([Parameter(Mandatory)][string]$Path) + if (-not $global:ConfUi.Map) { throw "Mappa configurazione non inizializzata." } $out = New-Object System.Collections.Generic.List[string] foreach ($entry in $global:ConfUi.Order){ if ($entry.type -eq 'kv'){ @@ -261,18 +258,36 @@ function Build-ConfigUI { $cfgPanel.Controls.Clear(); $global:ConfUi.Controls = @{} $xLabel=10; $xCtrl=260; $y=10; $h=24 foreach ($k in $global:ConfUi.Map.Keys) { - $v = $global:ConfUi.Map[$k] - $lbl = New-Object System.Windows.Forms.Label; $lbl.Text=$k; Set-Loc $lbl $xLabel ($y+4); Set-Sz $lbl 240 $h; $cfgPanel.Controls.Add($lbl) + $key = [string]$k # copia locale e forte tipizzazione + $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) { $chk = New-Object System.Windows.Forms.CheckBox + $chk.Tag = $key $chk.Checked = (('1','true','yes','y') -contains ($v.ToString().ToLower())) Set-Loc $chk $xCtrl ($y+2); Set-Sz $chk 20 $h - $chk.Add_CheckedChanged({ $global:ConfUi.Map[$k] = if ($chk.Checked) { 'true' } else { 'false' } }) - $cfgPanel.Controls.Add($chk); $global:ConfUi.Controls[$k]=$chk + $chk.add_CheckedChanged({ param($sender,$args) + try { + $k2 = [string]$sender.Tag + if (-not [string]::IsNullOrEmpty($k2)) { + $global:ConfUi.Map[$k2] = if ($sender.Checked) { 'true' } else { 'false' } + } + } catch { Write-Log "Update booleano fallito: $($_.Exception.Message)" 'WARN' } + }) + $cfgPanel.Controls.Add($chk); $global:ConfUi.Controls[$key]=$chk } else { - $tb = New-Object System.Windows.Forms.TextBox; $tb.Text=$v; Set-Loc $tb $xCtrl $y; Set-Sz $tb 540 $h - $tb.Add_TextChanged({ $global:ConfUi.Map[$k] = $tb.Text }) - $cfgPanel.Controls.Add($tb); $global:ConfUi.Controls[$k]=$tb + $tb = New-Object System.Windows.Forms.TextBox + $tb.Tag = $key + $tb.Text=$v; Set-Loc $tb $xCtrl $y; Set-Sz $tb 540 $h + $tb.add_TextChanged({ param($sender,$args) + try { + $k2 = [string]$sender.Tag + if (-not [string]::IsNullOrEmpty($k2)) { + $global:ConfUi.Map[$k2] = $sender.Text + } + } catch { Write-Log "Update testo fallito: $($_.Exception.Message)" 'WARN' } + }) + $cfgPanel.Controls.Add($tb); $global:ConfUi.Controls[$key]=$tb } $y += 28 }