Private/Get-rwDirFromUI.ps1
|
function Get-rwDirFromUI { param( [string]$Title, [System.IO.DirectoryInfo[]]$Folders, [switch]$SingleDir, [switch]$RetryOnCancel, [int]$RetryAttempts = 3 ) $mode = if ($SingleDir) { 'Single' } else { 'Multiple' } Write-Verbose "Get-rwDirFromUI: Title='$Title' SingleDir=$SingleDir" for ($try = 0; $try -lt $RetryAttempts; $try++) { try { $selectedNames = if (Get-rwGridViewAvailable) { $Folders | Select-Object Name, FullName | Out-GridView -Title $Title -OutputMode $mode | ForEach-Object { $_.Name } } else { Out-rwMenuCLI -Title $Title -Options $Folders.Name -OutputMode $mode } } catch { Write-Verbose "UI attempt $($try + 1) failed: $($_.Exception.Message)" if ($try -eq $RetryAttempts - 1) { Write-Warning "UI interaction failed after $RetryAttempts attempts: $($_.Exception.Message)" return @() } else { Write-Warning "UI interaction failed: $($_.Exception.Message) (attempt $($try + 1)/$RetryAttempts)" } continue } if (-not $selectedNames) { if (-not $RetryOnCancel) { return @() } if ($try -eq $RetryAttempts - 1) { return @() } if (-not (Show-rwPromptYesNo -Title "No selection made. Try again?")) { return @() } continue } $selected = Ensure-rwArray ($Folders | Where-Object { $selectedNames -contains $_.Name }) Write-Verbose "Selection complete: $($selected.Count) items selected" return $selected } return @() } |