pdca0-dev-hub/src/general/select-pdca0-folders.ps1

204 lines
7.0 KiB
PowerShell

<#
.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