Длина строки в переменной CMD/BAT (простой, но медленный алгоритм)
Определение длины строки штатными средствами CMD/BAT тот еще геморрой, но понадобилось, потому расскажу про несколько способов. В этом выпуске самый простой.
Команда
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=ABCDEFGHIJKLMNOPQRSTUVWXYZabcde fghijklmnopqrstuvwxyz0123456789"
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/dli