GCRaistlin:
Нашел новый способ получения длины строки. Работает немного быстрее старого рекордсмена - с использованием временного файла, при это не требует ни создания файлов на диске, ни внешних программ. Поддерживаются строки длиной до 8188 символов включительно.
[more]
Код:
[/more]
Можно также реализовать в виде переменной-подпрограммы:
[more]
Код:
[/more]
Так работает гораздо быстрее, чем при вызове через CALL:
Код:
Нашел новый способ получения длины строки. Работает немного быстрее старого рекордсмена - с использованием временного файла, при это не требует ни создания файлов на диске, ни внешних программ. Поддерживаются строки длиной до 8188 символов включительно.
[more]
Код:
set $nlde=^ rem Don't delete 2 blank lines above set S=111111111111111111111111111111111111111111111111111111111111111111111111 if defined S ( if defined Len set Len= setlocal enabledelayedexpansion for /f %%c in ("4095!$nlde!2048!$nlde!1024!$nlde!512!$nlde!256!$nlde!128!$nlde!64!$nlde!32!$nlde!16!$nlde!8!$nlde!4!$nlde!2!$nlde!1") do ( if errorlevel 1 (set /a Len-=%%c) else set /a Len+=%%c for %%d in (!Len!) do if "!S:~%%d,1!" == "" ( if %%c == 1 (endlocal & set Len=%%d) else (for /f %%z in ("") do cd) || rem ) else ( if %%c == 1 endlocal & set /a Len=%%d+1 ) ) ) else ( set Len=0 ) echo %Len% |
Можно также реализовать в виде переменной-подпрограммы:
[more]
Код:
set $nlde=^ rem Don't delete 2 blank lines above rem ППП GetLen rem Вычисляет длину строки. rem Требует предварительного определения $nlde. rem In: rem %%a - имя переменной, содержащей строку rem Out: rem %%b - имя переменной, в которую будет помещено значение длины rem Вызов: rem for /f "tokens=1,2" %%a in ("<string_var> <len_var>") do %GetLen% set GetLen=^ if defined %%a (^ (if defined %%b set %%b=)^ & setlocal enabledelayedexpansion^ & for /f %%c in ("4095!$nlde!2048!$nlde!1024!$nlde!512!$nlde!256!$nlde!128!$nlde!64!$nlde!32!$nlde!16!$nlde!8!$nlde!4!$nlde!2!$nlde!1") do (^ (if !errorlevel! == 1 (set /a %%b-=%%c) else set /a %%b+=%%c)^ & for %%d in (!%%b!) do if "!%%a:~%%d,1!" == "" (^ if %%c == 1 (endlocal ^& set %%b=%%d) else color 00^ ) else (^ if %%c == 1 (endlocal ^& set /a %%b=%%d+1)^ )^ )^ ) else (^ set %%b=0^ ) |
Так работает гораздо быстрее, чем при вызове через CALL:
Код:
set S=1111111111111111111111111111111111111111111111111111111111 for /f "tokens=1,2" %%a in ("S Len") do %GetLen% echo %Len% |