List and choose a file

This code lists up to 36 files in the current directory.

You can specify the file extension.

User chooses from a list and full path is returned in %file%

If no file found, returns with %file% not defined.

@echo offsetlocal
call :SelectFileOrFolder file=*.isoecho Selected file = "%file%"goto :EOF
REM --------------
:SelectFileOrFolder resultVar [ "list of wildcards" | /F ]
setlocal EnableDelayedExpansion
rem Process parametersset "files=*.*"if "%~2" neq "" (   if /I "%~2" equ "/F" (set "files=") else set "files=%~2")
rem Set the number of lines per page, max 36set "pageSize=36"set "char=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
rem Load current directory contents
:ProcessThisDirset "numNames=0"for %%a in (%files%) do (   set /A numNames+=1   set "name[!numNames!]=%%a")if %numNames% EQU 0 goto :endSelect
set start=1set /A page=(start-1)/pageSize+1, end=start+pageSize-1if %end% gtr %numNames% set end=%numNames%echo/if %start% equ 1 (set base=0) else set "base=1"set /A lastOpt=pageSize+base, j=basefor /L %%i in (%start%,1,%end%) do (   for %%j in (!j!) do echo     !char:~%%j,1! - !name[%%i]!   set /A j+=1)echo/
:GetOptionchoice /C "%char%" /N /M "Select desired item: %mssg%"if %errorlevel% gtr %lastOpt% goto GetOptionset /A option=start+%errorlevel%-1-baseif %option% gtr %numNames% goto GetOption
:endSelectrem Return selected fileecho "!name[%option%]!"for %%a in ("!name[%option%]!") do set "result=%%~Fa"endlocal & set "%~1=%result%"exit /B