Quantcast
Channel: Ru.Board
Viewing all articles
Browse latest Browse all 1227229

Командная строка, батники, сценарии (bat, cmd) (1493) / И все с этим связанное... (5)

$
0
0
GCRaistlin:
Нашел новый способ получения длины строки. Работает немного быстрее старого рекордсмена - с использованием временного файла, при это не требует ни создания файлов на диске, ни внешних программ. Поддерживаются строки длиной до 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]

Можно также реализовать в виде переменной-подпрограммы:
[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^
)
[/more]
Так работает гораздо быстрее, чем при вызове через CALL:

Код:

set S=1111111111111111111111111111111111111111111111111111111111
for /f "tokens=1,2" %%a in ("S Len") do %GetLen%
echo %Len%

Viewing all articles
Browse latest Browse all 1227229

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>