Если вы используете Vista или более позднюю версию, вы можете использовать команду CHOICE (введите «CHOICE /?» Для документации). По умолчанию CHOICE не учитывает регистр, что, на мой взгляд, хорошо для вашей ситуации.
setlocal enableDelayedExpansion
set "choices=abcdefghijklmnopqrstuvwxyz"
echo Under which drive will you save the backup? ( one letter only, a-z )
choice /c %choices% /n
set /a "n=%errorlevel%-1"
set "drive=!choices:~%n%,1!"
Ниже приведен вариант стратегии Giles Arcas для проверки записей после ввода, которая допускает как прописные, так и строчные буквы.Он также немного более надежен в том смысле, что он правильно обрабатывает пустые строки.Это должно работать на XP и более поздних версиях.
setlocal enableDelayedExpansion
set "choices=abcdefghijklmnopqrstuvwxyz"
:select
echo Under which drive will you save the backup? ( one letter only, a-z )
set "drive="
set /p "drive="
for /l %%N in (0 1 25) do if /i "!choices:~%%N,1!"=="%drive%" goto :continue
goto :select
:continue
Вот еще один вариант, который использует регулярное выражение FINDSTR для проверки записи
setlocal enableDelayedExpansion
:select
echo Under which drive will you save the backup? ( one letter only, a-z )
set "drive="
set /p "drive="
echo !drive!|findstr /r /i "^[abcdefghijklmnopqrstuvwxyz]$" >nul || goto :select
Рекомендуется отложенное расширение, если пользователь вводитстрока типа "&"&