Все входные ограничения команды set /P
, включая эту, могут быть устранены, если мы напишем нашу собственную подпрограмму readline.Это базовая версия:
@echo off
rem Insert next line if needed:
SETLOCAL DISABLEDELAYEDEXPANSION
set exclam=!
set caret=^^
setlocal EnableDelayedExpansion
set ascii=01234567890123456789012345678901^
!exclam!^"#$%%^&'()*+,-./0123456789:;^<=^>?^
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]!caret!^_^
`abcdefghijklmnopqrstuvwxyz{^|}~
for /F %%a in ('echo prompt $H ^| cmd') do set BS=%%a
set lineread=
:nextkey
getakey
set code=%errorlevel%
if %code% lss 32 goto checkBS
:ascii
set char=!ascii:~%code%,1!
colormsg 7 "!char!"
set lineread=!lineread!!char!
goto nextkey
:checkBS
if not %code% == 8 goto checkExtended
if "!lineread!" == "" goto nextkey
colormsg 7 "%BS% %BS%"
set lineread=!lineread:~0,-1!
goto nextkey
:checkExtended
if not %code% == 0 goto checkCR
getakey
goto nextkey
:checkCR
if not %code% == 13 goto nextkey
echo/
ECHO Line Read: [!lineread!]
Например, если вы хотите игнорировать заглавные буквы при вводе, просто вставьте эти две строки после :ascii
label:
:ascii
rem If key is between A (65) and Z (90): ignore it
if %code% geq 65 if %code% leq 90 goto nextkey
Чтобы преобразовать заглавные буквыбуквы в нижнем регистре:
:ascii
rem If key is upcase (between A-65 and Z-90): convert it to lowcase (a-97 z-122)
if %code% geq 65 if %code% leq 90 set /A code+=32
Мы можем даже написать асинхронную (одновременную) процедуру чтения строки, которая позволяет пакетному файлу продолжать работать одновременно с чтением строки.
Оба GETAKEY.Программы COM и COLORMSG.COM ранее задавались в этом вопросе: Пакетный цвет на строку