Толик Панков
hex_laden
............ .................. ................

October 2025
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Толик Панков [userpic]
Длина строки в переменной CMD/BAT (простой, но медленный алгоритм)

Преамбула


Определение длины строки штатными средствами CMD/BAT тот еще геморрой, но понадобилось, потому расскажу про несколько способов. В этом выпуске самый простой.

Ограничения на размер данных в CMD


Команда set: экспериментально 1024 символа.

Общий размер переменной: 8191 символ.
Длина командной строки: 8191 символ.
Отсюда

Внимание! Совместимость алгоритмов от Windows XP и выше. Т.е. для DOS и Windows 9x не подойдет.

Медленный алгоритм


Есть медленное, но простое решение "в лоб":

1. Задать циклу for перебирать числа от 0 до какого-нибудь заведомо большого числа, например 9000.

for /L %%a in (0,1,9000) do [...]

2. Получать из строки символ под номером %%a:

param:~%%a,1

В общем виде:
param:a,b
где:
param: - взять из переменной param символ(ы)
a - позиция нужного символа
b - количество символов

3. Сравнивать его с пустой строкой, и если строка не пуста (NEQ):

if "!param:~%%a,1!" NEQ "" ( [...]

4. Прибавить счетчик символов в отдельной переменной:

Set /a "len+=1"

Иначе прервать цикл.

Можно реализовать это в виде функции BAT-файла:

:Strlen 
	SetLocal EnableExtensions EnableDelayedExpansion
	Set Out=%~0
	Set "param=%~1"
	Set "len=0"

	for /L %%a in (0,1,9000) do (
			if "!param:~%%a,1!" NEQ "" (
				Set /a "len+=1"
			) else goto :_break
		)
	:_break


Пример BAT-файла на GitHub

Вывод на экран для строк:

Set "String1=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Set "String2=132 sd72 362 232 83827 3n238237"
Set "String3=1 >>>32 lnsdfn lskd &&&&& _----__\\\\|||sd72 *&&&@@######~~~~~362 232 83827 3n238237"
Set "String4=A"
Set "String5=%%1"


Последняя строка задается в качестве параметра командной строки BAT-файла.

>strlenslow.bat 7894561230.

Length String 1 - [62]
Length String 2 - [31]
Length String 3 - [88]
Length String 4 - [1]
Length String 5 (Command Line Parameter) - [11]


Проблемы алгоритма:

1. Медленный
2. Если задать пустую строку в параметре командной строки - алгоритм ломается:

>strlenslow.bat
[...]
Length String 5 (Command Line Parameter) - [9001]


Хотя, последнее легко исправить.

А про более быстрый алгоритм поговорим в следующей серии.

Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2023/04/26/dlina-stroki-v-peremennoj-cmd-bat-prostoj-no-medlennyj-algoritm/

Tags: ,
Comments

Ну не сказать, чтоб это в полной мере бинарный поиск, но что-то похожее.
С другой стороны вообще хз, почему это работает быстрее.
Командный процессор винды писали инопланетяне, накурившиеся анаши.