204 lines
7.0 KiB
PowerShell
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
|