<# .SYNOPSIS Script per selezionare una o più cartelle nella directory due livelli sopra rispetto alla posizione dello script. .DESCRIPTION Questo script mostra le cartelle presenti nella directory corrente e permette di: - Navigare tra le cartelle usando le frecce su/giù - Selezionare/deselezionare più elementi usando Spazio - Confermare la selezione con Invio .NOTES Autore: Cascade Data: 2025-07-04 #> function Show-FolderSelector { [CmdletBinding()] param( [Parameter(Mandatory=$false)] [switch]$MultiSelect = $false, [Parameter(Mandatory=$false)] [string]$DirectoryPath = $null ) # Ottieni le cartelle nella directory specificata o corrente if ($DirectoryPath) { $folders = Get-ChildItem -Path $DirectoryPath -Directory } else { $folders = Get-ChildItem -Directory } if ($folders.Count -eq 0) { Write-Host "Nessuna cartella trovata nella directory specificata." -ForegroundColor Yellow return $null } # Inizializza variabili $currentPosition = 0 $selectedFolders = @{} $exit = $false $height = $folders.Count # Pulisci la console e nascondi il cursore Clear-Host [Console]::CursorVisible = $false try { # Loop principale while (-not $exit) { # Pulisci lo schermo e mostra l'intestazione Clear-Host if ($MultiSelect) { Write-Host "Seleziona cartelle (usa frecce su/giù, Spazio per selezionare, Invio per confermare):" -ForegroundColor Cyan } else { Write-Host "Seleziona una cartella (usa frecce su/giù, Invio per confermare):" -ForegroundColor Cyan } Write-Host "----------------------------------------------------------------" -ForegroundColor Cyan # Mostra la lista di cartelle for ($i = 0; $i -lt $folders.Count; $i++) { $folder = $folders[$i] $prefix = " " # Evidenzia la posizione corrente if ($i -eq $currentPosition) { $prefix = "> " $foregroundColor = "Green" } else { $foregroundColor = "White" } # Mostra lo stato di selezione if ($selectedFolders.ContainsKey($folder.Name)) { $prefix += "[X] " } else { $prefix += "[ ] " } # Stampa la riga Write-Host "$prefix$($folder.Name)" -ForegroundColor $foregroundColor } # Mostra il conteggio delle selezioni Write-Host "----------------------------------------------------------------" -ForegroundColor Cyan $selectionCount = $selectedFolders.Count Write-Host "Elementi selezionati: $selectionCount" -ForegroundColor Yellow # Leggi l'input dell'utente $key = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") # Gestisci l'input switch ($key.VirtualKeyCode) { 38 { # Freccia su if ($currentPosition -gt 0) { $currentPosition-- } } 40 { # Freccia giù if ($currentPosition -lt $folders.Count - 1) { $currentPosition++ } } 32 { # Spazio if ($MultiSelect) { $folderName = $folders[$currentPosition].Name if ($selectedFolders.ContainsKey($folderName)) { $selectedFolders.Remove($folderName) } else { $selectedFolders[$folderName] = $folders[$currentPosition] } } } 13 { # Invio (conferma) $exit = $true } 27 { # Esc (annulla) $selectedFolders = @{} $exit = $true } } } # Restituisci i risultati if ($selectedFolders.Count -gt 0) { return $selectedFolders.Values } else { # Se non ci sono selezioni esplicite, restituisci la cartella corrente return $folders[$currentPosition] } } finally { # Ripristina la visibilità del cursore [Console]::CursorVisible = $true Write-Host "" } } # Funzione principale function Main { param( [Parameter(Mandatory=$false)] [switch]$MultiSelect = $false ) # Determina il percorso dello script $scriptPath = $PSScriptRoot # Calcola il percorso ..\..\..\pdca0 rispetto alla posizione dello script $targetPath = Join-Path $PSScriptRoot "..\..\..\pdca0" | Resolve-Path -ErrorAction SilentlyContinue if (-not $targetPath) { Write-Host "La cartella ..\..\..\pdca0 non esiste rispetto alla posizione dello script ($PSScriptRoot)." -ForegroundColor Red return $null } # Mostra le cartelle disponibili e ottieni la selezione Write-Host "Cartelle presenti nella directory: $targetPath" -ForegroundColor Cyan Get-ChildItem -Path $targetPath -Directory | ForEach-Object { Write-Host "- $($_.Name)" } Write-Host "" # Avvia il selettore di cartelle $selectedFolders = Show-FolderSelector -MultiSelect:$MultiSelect -DirectoryPath $targetPath # Mostra i risultati Write-Host "" if ($selectedFolders -is [array]) { Write-Host "Hai selezionato le seguenti cartelle:" -ForegroundColor Green $selectedFolders | ForEach-Object { Write-Host "- $($_.Name)" } # Restituisci l'array di cartelle selezionate return $selectedFolders } elseif ($selectedFolders -ne $null) { Write-Host "Hai selezionato la cartella: $($selectedFolders.Name)" -ForegroundColor Green # Restituisci la singola cartella selezionata return $selectedFolders } else { Write-Host "Nessuna cartella selezionata." -ForegroundColor Yellow return $null } } <# .SYNOPSIS Seleziona una o più cartelle nella directory che si trova due livelli sopra rispetto alla posizione dello script. .DESCRIPTION Questo script permette di selezionare una o più cartelle nella directory che si trova due livelli sopra rispetto alla posizione dello script. .PARAMETER MultiSelect Abilita la selezione multipla di cartelle. Se non specificato, permette solo la selezione di una cartella. .EXAMPLE .\Select-Folders.ps1 Seleziona una singola cartella. .EXAMPLE .\Select-Folders.ps1 -MultiSelect Permette di selezionare più cartelle. #> param( [Parameter(Mandatory=$false)] [switch]$MultiSelect = $false ) # Esegui lo script $result = Main -MultiSelect:$MultiSelect return $result