Я создал функцию пишущей машинки для партии (просто для удовольствия) и также столкнулся с этим ограничением. Ниже урезанная версия, чтобы показать вам, как я решил проблему. Вы можете использовать до 8191 символа, включая разделители пробелов при выполнении из командной строки. При использовании переменной максимальная длина составляет 32 767.
@echo off
::#############################################################################
:_typeWriter <stringVariable> <skipLinefeed>
::#############################################################################
::
:: Copyleft Denny Lenselink 2018
::
%= Set local environment =%
( call ) & 2>nul setlocal EnableDelayedExpansion || exit /b 99
:: Set vars
set "_CNT=0" && set "_LEN=0" && set "_STR= %~1" && set "_TOT=0"
:_typeWriter_Loop
set /a "_CNT+=1"
:: 31 tokens limit fix. Cut the used part of the string and set counter to 1
if !_CNT! equ 32 ( set "_CNT=1" && set "_STR=!_STR:~%_TOT%!" && set "_TOT=0" )
:: Go through string (seeking words)
for /f "tokens=%_CNT% delims= " %%* in ( "%_STR%" ) do (
:: Set word var
set "_WRD=#%%*"
:: Calculate word length
for /l %%I in ( 12, -1, 0 ) do (
set /a "_LEN|=1<<%%I"
for %%J in ( !_LEN! ) do ( if "!_WRD:~%%J,1!"=="" set /a "_LEN&=~1<<%%I" )
)
:: Strip first char (used before to calculate correct word length)
set "_WRD=!_WRD:~1!"
:: Count chars including spaces
set /a "_TOT=!_TOT!+!_LEN!+1"
:: Type word or use echo
<nul set /p "=!_WRD! "
:: Do a loop
goto _typeWriter_Loop
)
:: No linefeed when specified
if "%~2"=="" echo.
endlocal
exit /b
Выполнить:
C: \ Temp> typewriter "this is a test that works"
Результат:
this is a test that works
Изменение строки <nul set /p "=!_WRD! "
на echo !_WRD!
приведет к:
this
is
a
test
that
works