Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @ECHO off
- rem Включаем отложеную подстановку переменных (ENABLEDELAYEDEXPANSION)
- rem Нужно для того, чтобы переменные виже !var! подставлялись в момент выполнения
- rem В противном случае внутри блоков if переменные нельзя будет менять
- rem Включием расширенную обработку комманд (ENABLEEXTENSIONS)
- rem В частности для того, чтобы можно было использовать параметр /I в if.
- setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS
- echo Создание массива А и вывод:
- call :array new A "'one','two','three','foo','bar'"
- call :array dump A
- echo.
- echo Добавление к массиву A элементов из набора
- call :array add A "'first line' 'Вторая строка' 12 54" !
- call :array dump A
- echo.
- echo Поиск строки BAR
- call :array find A "BAR" i
- echo Найдено в позиции !_l!
- echo.
- echo Удаление элементов 3 5 8
- call :array del A "3 5 8"
- call :array dump A
- echo.
- echo Удаление элемента two
- call :array find A Two i
- call :array del A !_l!
- call :array dump A
- echo.
- echo Сортировка массива
- call :array sort A
- call :array dump A
- goto :eof
- goto :exit
- rem ===== Arrays =====
- rem Важно помнить, что после каждого вызова функции удаляются все переменные, начинающиеся на __
- :array
- rem Сохранение аргументов в локальных переменных
- rem чтобы можно было обращать отложенным методом !__1!
- rem ~ - убрать кавычки
- set __1=%~1
- set __2=%~2
- set __3=%~3
- set __4=%~4
- set __5=%~5
- set __6=%~6
- rem == create ==
- rem Создание массива
- rem call :array create имя_массива [размер=0] [начальные значения=0]
- if /I "!__1!"=="create" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- set _name=array_!__2!
- rem Размер
- set /a _count=0
- if not "!__3!"=="" (
- set /a _count = !__3!
- )
- rem Начальные значения
- set _defval=0
- if not "!__4!"=="" (
- set _defval=!__4!
- )
- rem Удаление массива, если существует c таким же именем
- rem Можно было не удалять все переменные, а только оставшиеся после перезаписи, но может быть как-нибудь потом
- call :array_del_ifdef !__2!
- set /a __maxindex=!_count!-1
- for /l %%i in (0,1,!__maxindex!) do set !_name!_%%i=!_defval!
- set /a !_name!_count = !_count!
- set _name=
- set _count=
- set _defval=
- rem == new ==
- rem Создание массива из набора значений
- rem call :array new имя_массива "знач1, знач2, 'строка' ..."
- ) else if /I "!__1!"=="new" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- if "!__3!"=="" (
- echo Не указан набор значений
- goto :eof
- )
- rem Заменяем одинарные кавычки на двойные
- set _elems=!__3:'="!
- set _name=array_!__2!
- rem Удаление массива, если существует c таким же именем
- call :array_del_ifdef !__2!
- rem Создаем последовательно каждый элемент и присваиваем значение
- set /a __i=0
- for %%i in (!_elems!) do (
- rem ~ - убираем кавычки, которые необходимя просто для группировки
- set !_name!_!__i!=%%~i
- set /a __i+=1
- )
- set /a !_name!_count=!__i!
- set _elems=
- rem == get ==
- rem Получение элемента массива (сохранение в переменную)
- rem call :array get имя_массива [index=0] [имя_целевой_переменной=_l]
- rem Если индекс отрицательный, то он считается с конца (-1 - последний, -2 - предпоследний и т.д.)
- ) else if /I "!__1!"=="get" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- set __name=array_!__2!
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Индекс элемента
- set /a __i = 0
- if not "!__3!"=="" (
- set /a __i = !__3!
- )
- rem Если индекс отрицательный, то считаем с конца
- if !__i! LSS 0 (
- rem Получаем размер
- call :set __count !__name!_count
- set /a __i=!__count!+!__i!
- )
- rem Имя переменной, содержащей значение элемента
- set __target=!__name!_!__i!
- rem Проверка существования элемента
- if not defined !__target! (
- echo В массиве !__2! нет элемента с индексом !__i!
- goto :eof
- )
- rem Записываем значение элемента во временную переменную
- call :set __value !__target!
- set __var=_l
- if not "!__4!"=="" (
- set __var=!__4!
- )
- rem Записываем в целевую
- call :set !__var! __value
- rem == echo ==
- rem Вывод значения элемента на экран
- ) else if /I "!__1!"=="echo" (
- call :array get !__2! !__3! _tmpval
- if not "!_tmpval!"=="" (
- echo !_tmpval!
- )
- set _tmpval=
- rem == list ==
- rem Вывод значений списком. Может быть полезно при перенаправлении вывода
- rem call :array list имя_массива
- rem Пример: call :array list myArr > array.txt - сохраняет текущий массив в файт array.txt
- rem Для сохранения в кодировке cp1251 используйте save
- ) else if /I "!__1!"=="list" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex=!__count!-1
- rem Вывод значений
- for /l %%i in (0,1,!__maxindex!) do (
- call :set __value !__name!_%%i
- echo !__value!
- )
- rem == save ==
- rem Сохраняет массив в указанный файл в кодировке cp1251
- rem call :array save имя_массива имя_файла
- ) else if /i "!__1!"=="save" (
- rem Имя файла
- if "!__3!"=="" (
- echo Не указано имя файла
- goto :eof
- )
- rem Парсим вывод команды chcp, ищим номер кодовой страницы и запаминаем
- for /f "usebackq tokens=2 delims=:" %%i in (`chcp`) do set /a _pageset=%%i
- rem Меняем кодовую страницу на 1251
- chcp 1251>nul
- rem Перенаправляем вывод list в файл
- call :array list !__2! > !__3!
- rem Возвращаем кодовую страницу
- chcp !_pageset!>nul
- set _pageset=
- rem == load ==
- rem Чтение в массив из файла, с кодировкой cp1251
- rem call :array load имя_массива имя_файла
- ) else if /i "!__1!"=="load" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Имя файла
- if "!__3!"=="" (
- echo Не указано имя файла
- goto :eof
- )
- if not exist "!__3!" (
- echo Файл !__3! не найден
- goto :eof
- )
- set _file=!__3!
- set _shortname=!__2!
- rem Удаляем массив, если сущестует
- call :array_del_ifdef !__2!
- rem Парсим вывод команды chcp, ищим номер кодовой страницы и запаминаем
- for /f "usebackq tokens=2 delims=:" %%i in (`chcp`) do set /a _pageset=%%i
- rem Меняем кодовую страницу на 1251
- chcp 1251>nul
- rem Вносим каждую строку файла в массив
- rem Используем call, чтобы выполнялось в новой кодовой странице
- call :array load_unsafe !_shortname! !_file!
- rem Возвращаем кодовую страницу
- chcp !_pageset!>nul
- set _name=
- set _file=
- set _pageset=
- set _shortname=
- rem == load_unsafe ==
- rem Чтение массива из файла небезопасное.
- rem Нет проверок, нет удаления существующего массива, что ведёт к засорению памяти
- rem Используется при load
- ) else if /I "!__1!"=="load_unsafe" (
- set __i=0
- rem Вносим каждую строку файла в массив
- for /f "tokens=*" %%i in (!__3!) do (
- set array_!__2!_!__i!=%%i
- set /a __i+=1
- )
- set array_!__2!_count=!__i!
- rem == count ==
- rem Количество элементов в массиве
- rem call :array count имя_массива [имя_целевой_переменной=_l]
- ) else if /I "!__1!"=="count" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- set __name=array_!__2!
- rem Имя целевой переменной
- set __var=_l
- if not "!__3!"=="" (
- set __var=!__3!
- )
- rem Записываем в целевую
- call :set !__var! !__name!_count
- rem == dump ==
- rem Вывод массива на экран
- rem call :array dump имя_массива
- ) else if /I "!__1!"=="dump" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex=!__count!-1
- echo array[!__count!]: !__2!
- if !__count!==0 (
- echo Массив не содержит элементов
- goto :eof
- )
- for /l %%i in (0,1,!__maxindex!) do (
- call :set __value !__name!_%%i
- echo [%%i] !__value!
- )
- rem == set ==
- rem Присвоение значения элементу
- rem call :array set имя_массива индекс значение
- ) else if /I "!__1!"=="set" (
- if "!__4!"=="" (
- echo Не указано значение. Значение не может быть пустым
- goto :eof
- )
- rem Сохраняем параметры, для того, чтобы после вызова get они не потерялись
- set _name=array_!__2!
- set /a _i=!__3!
- set _value=!__4!
- rem Получение значения обеспечивает нам проверку параметров
- rem Важно. После операции все локальные переменные (__*) очищаются
- call :array get !__2! !__3! _localresult
- rem Если результат get существует, то удаляем элемент
- rem Сообщения об ошибках в противном случае покажет сам get
- if defined _localresult (
- set !_name!_!_i!=!_value!
- )
- set _localresult=
- set _name=
- set _i=
- set _value=
- rem == delete ==
- rem Удаление массива
- rem call :array delete имя_массива
- ) else if /I "!__1!"=="delete" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex=__count-1
- rem Удаляем все элементы
- for /l %%i in (0,1,!__maxindex!) do set !__name!_%%i=
- rem Удаляем размер
- set !__name!_count=
- rem == del ==
- rem Удаление элемента, элементов или всего массива
- rem call :array del имя_массива [индекс_элемента|набор элементов=удаление всего массива]
- rem Примеры: call :array del myArr "4,6,8" - удаляет из массива myArr элементы с индексами 4, 6 и 8
- rem call :array del myArr 9 - удаляет из массива myArr 9й элемент
- rem call :array del myArr - удаляет массив myArr
- ) else if /I "!__1!"=="del" (
- rem Если не указан индекс, то удаляем весь массив
- if "!__3!"=="" (
- call :array delete !__2!
- goto :eof
- )
- rem Если параметр не число, то перенаправляем на удаление по списку индексов
- set __localresult=
- call :is_number "!__3!" __localresult
- if !__localresult!==0 (
- call :array del_elements !__2! "!__3!"
- goto :eof
- )
- rem Если индекс указан, то удаляем только элемент
- rem Сохраняем параметры, для того, чтобы после вызова get они не потерялись
- set _name=array_!__2!
- set /a _i=!__3!
- rem Получение значения обеспечивает нам проверку параметров
- rem Важно. После операции все локальные переменные (__*) очищаются
- set _localresult=
- call :array get !__2! !__3! _localresult
- rem Если результат get не существует, то выходим
- rem Сообщения об ошибках в этом случае покажет сам get
- if not defined _localresult (
- set _name=
- goto :eof
- )
- set _localresult=
- rem Получаем размер
- call :set __count !_name!_count
- rem maxindex=count-2, так как идём до предпоследнего элемента
- set /a __maxindex=__count-2
- set /a __nextindex=!_i!
- rem Пересчёт индексов
- for /l %%i in (!_i!,1,!__maxindex!) do (
- set /a __nextindex+=1
- call :set !_name!_%%i !_name!_!__nextindex!
- )
- set /a !_name!_count-=1
- rem Удаление последнего элемента (он был перемещёт на позицию вверх)
- set !_name!_!__nextindex!=
- rem Удаляем локальные переменные
- set _name=
- set _i=
- rem == del_elements ==
- rem Удаление элементов по списку индексов
- rem call :array del_elements имя_массива
- rem Лучше использовать del
- ) else if /I "!__1!"=="del_elements" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Проверка индексов
- if "!__3!"=="" (
- echo Не указан набор индексов
- goto :eof
- )
- rem Имя массива с префиксом
- set __name=array_!__2!
- rem Приводим набор к цисловому набору вида ;54;2;3;5;
- call :to_intset "!__3!" __indexes
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex=__count-1
- rem Количество удаленных элементов
- rem Используется для поправки размера, и, главное, для смещения индексов
- set /a __deleted=0
- rem Пересчёт индексов
- rem Идея состоит в том, что мы бежим по исходному массиву, и если попадаем в позицию
- rem которую нужно удалить, то в текущую позицию помещаем элемент, который будет идти
- set __exit_i_loop=0
- for /l %%i in (0,1,!__maxindex!) do (
- if not !__exit_i_loop!==1 (
- rem Индекс элемента в исходном массиве, соответствущий данному положению
- set /a __newindex=%%i+!__deleted!
- set __exit_j_loop=0
- rem Пробегаемся по индексам вперёд, пока будут попадаться индексы элементов
- rem которых требуется удалить.
- for /l %%j in (!__newindex!,1,!__maxindex!) do (
- if not !__exit_j_loop!==1 (
- rem Если в наборе индексов к удалению содержится текущий, то
- rem он подлежит удалению, а значит индексы в результирующем массиве
- rem далее будут отставать от соответствующих в исходном на ещё одну позицию больше
- call :str_contains __indexes %%j __localresult
- if !__localresult!==1 (
- set /a __deleted+=1
- ) else (
- set __exit_j_loop=1
- )
- )
- )
- rem Пересчитываем, чтобы понять, нужно ли дальше бежать, или нет
- set /a __newindex=%%i+!__deleted!
- if !__newindex! GTR !__maxindex! (
- set __exit_i_loop=1
- ) else (
- call :set !__name!_%%i !__name!_!__newindex!
- )
- )
- )
- set /a !__name!_count=!__count!-!__deleted!
- rem Удаление последнего элемента (он был перемещёт на позицию вверх)
- set !_name!_!__nextindex!=
- rem == add ==
- rem Добавить элемент в конец массива или набор элементов
- rem call :array add имя_массива значение
- rem call :array add имя_массива набор !
- rem Чтобы добавить набор, необходимо указать параметр !
- rem Можно использовать вместо последней конструкции вызов процедуры expand
- ) else if /I "!__1!"=="add" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Значение
- if "!__3!"=="" (
- echo Не задано значение. Значение не может быть пустым
- goto :eof
- )
- rem Пареметр l указывает на то, что добавляется набор
- if /i "!__4!"=="!" (
- call :array expand !__2! "!__3!"
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Имя массива с префиксом
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- rem Задаём значение
- set !__name!_!__count!=!__3!
- rem и увеличиваем размер
- set /a !__name!_count+=1
- rem == expand ==
- rem Добавить набор элементов в конец массива
- rem call :array expand имя_массива набор элементов
- rem Пример: call :array expand myArr "'first line' 'Вторая строка' 12 54"
- rem добавление к массиву myArr 4х элементов
- ) else if /I "!__1!"=="expand" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя массива
- goto :eof
- )
- rem Набор
- if "!__3!"=="" (
- echo Не указан набор элементов. Набор не может быть пустым
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Имя массива с префиксом
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- rem Заменяем одинарные кавычки на двойные
- set __3=!__3:'="!
- rem Создаем последовательно каждый элемент и присваиваем значение, начиная с последнего
- set /a __i=!__count!
- for %%i in (!__3!) do (
- rem ~ - убираем кавычки, которые необходимы для группировки
- set !__name!_!__i!=%%~i
- set /a __i+=1
- )
- set /a !__name!_count=!__i!
- rem == copy ==
- rem Копирование массива
- rem call :array copy имя_копируемого имя_конечного
- ) else if /I "!__1!"=="copy" (
- rem Имя исходного массива
- if "!__2!"=="" (
- echo Не указано имя исходного массива
- goto :eof
- )
- rem Имя целевого массива
- if "!__3!"=="" (
- echo Не указано имя целевого массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Имена массивов с префиксом
- set _name=array_!__2!
- set _name_new=array_!__3!
- rem Получаем размер
- call :set _count !_name!_count
- set /a _maxindex = !_count!-1
- rem Удаляем целевой массив, если существует
- call :array_del_ifdef !__3!
- rem Копируем поэлементно
- for /l %%i in (0,1,!_maxindex!) do (
- call :set !_name_new!_%%i !_name!_%%i
- )
- rem Копируем размер
- set /a !_name_new!_count=!_count!
- rem Удаляем локальные переменные
- set _name=
- set _name_new=
- set _count=
- set _maxindex=
- rem == each ==
- rem Вызов комманды для каждого элемента массива
- rem В качество подстановок используйте:
- rem При вызове комманды:
- rem _i_ - индекс текущего элемента
- rem _val_ - значение текущего элемента
- rem call :array each имя_массива комманда x
- rem
- rem Пример:
- rem call :array new B "1 4 1 6 6 2"
- rem set sum=0
- rem call :array each B "set /a sum+=_val_" x
- rem echo !sum!
- rem Выведет 20 - сумма всех элементов в массива
- rem При вызове процедуры:
- rem %~1 - значение (~ - убираем кавычки)
- rem %2 - номер индекса
- rem
- rem Пример:
- rem call :array new B "1 4 1 6 6 2"
- rem call :array each B to_string
- rem echo !str!
- rem :to_string
- rem set str=!str!%~1
- rem goto :eof
- rem Выведет 141662
- ) else if /I "!__1!"=="each" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя исходного массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Комманда
- if "!__3!"=="" (
- echo Не задана камманда each
- goto :eof
- )
- set __is_command=0
- if /i "!__4!"=="x" (
- set __is_command=1
- )
- set __command=!__3!
- rem Имя массива с префиксом
- set __name=array_!__2!
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex = !__count!-1
- for /l %%i in (0,1,!__maxindex!) do (
- call :set _val_ !__name!_%%i
- if !__is_command!==1 (
- call :str_replace __command _i_ %%i __exec
- call :str_replace __exec _val_ "!_val_!"
- !__exec!
- ) else (
- call :!__command! "!_val_!" %%i
- )
- )
- rem == sort ==
- rem Сортировка массива
- rem Укажите параметр R для сортировки в обратном порядке
- rem call :array sort имя_массива
- rem call :array sort имя_массива R - сортировка в обратном порядке
- ) else if /I "!__1!"=="sort" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя исходного массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Реверсивная сортировка
- if /I "!__3!"=="R" (
- set _rev=/r
- )
- set _shortname=!__2!
- rem Имя массива с префиксом
- set _name=array_!__2!
- rem Генерируем имя для временного файла
- set _tmpfile=%TMP%\array_sort_%random%%random%
- rem Сохраняем массив в файл
- call :array list !_shortname! > "!_tmpfile!.txt"
- rem Сортируем из файла
- sort !_rev! !_tmpfile!.txt /o "!_tmpfile!_sorted.txt"
- rem Удаляем текущиий массив - можно не удалять, потому что размер останется таким же
- rem и все переменные просто перезапишутся
- rem call :array delete !_shortname!
- rem Читаем результат из файла
- call :array load_unsafe !_shortname! "!_tmpfile!_sorted.txt"
- rem Удаляем временные файлы
- del /f /q "!_tmpfile!_sorted.txt" "!_tmpfile!.txt"
- rem Удаляем локальные переменные
- set _name=
- set _tmpfile=
- set _shortname=
- set _rev=
- rem == find ==
- rem Поиск элемента
- rem Возвращает номер первого найденного элемента или -1, если не найдено
- rem Используёте параметр I для игнорирования регистра
- rem call :array find имя_массива искомый_элемент N [имя_целевой_переменной=_l] - N - лобой символ, отличный от i
- rem call :array find имя_массива искомый_элемент I [имя_целевой_переменной=_l] - поиск с игнорированием регистра
- rem Пример: call :array find myArr "Себастьян Перейро" N sebastNum
- rem возвращает в переменную sebastNum номер элемента в массиве myArr, содержащий строку Себастьян Перейро с учётом регистра
- rem N - любой символ, кроме I, чтобы не включить игнорирование регистра
- ) else if /i "!__1!"=="find" (
- rem Имя массива
- if "!__2!"=="" (
- echo Не указано имя исходного массива
- goto :eof
- )
- rem Проверка существования массива
- call :array_notdefined !__2! __errors
- rem Если есть ошибки, то выходим
- if not !__errors!==0 goto :eof
- rem Значение
- if "!__3!"=="" (
- echo Не задано значение. Значение не может быть пустым
- goto :eof
- )
- set __find=!__3!
- rem Имя массива с префиксом
- set __name=array_!__2!
- rem Игнорирование регистра
- if /i "!__4!"=="I" (
- set __ignorecase=1
- )
- rem Имя целевой переменной
- set __var=_l
- if not "!__5!"=="" (
- set __var=!__5!
- )
- rem Получаем размер
- call :set __count !__name!_count
- set /a __maxindex=__count-1
- rem Устанавливаем результат -1
- set !__var!=-1
- set __exit_loop=0
- for /l %%i in (0,1,!__maxindex!) do (
- if not !__exit_loop!==1 (
- rem Читаем значение элемента
- call :set __value !__name!_%%i
- rem Сравниваем со строкой поиска с ignorecase
- rem Постановка флага как переменной вызывает ошибку
- if !__ignorecase!==1 if /i "!__value!"=="!__find!" (
- set __exit_loop=1
- set !__var!=%%i
- )
- if not !__ignorecase!==1 if "!__value!"=="!__find!" (
- set __exit_loop=1
- set !__var!=%%i
- )
- )
- )
- )
- call :clear_local
- goto :eof
- rem Копирует значение одной переменной в другую
- rem Плюс в том, что имя переменной, значение которой извлекается, может быть составным
- rem call :set имя_целевой_переменной имя_переменной_содержищее_значение
- :set
- set %~1=!%~2!
- goto :eof
- rem Удаление локальных переменных (начинаются с __)
- :clear_local
- rem Устанавливаю переменную __, чтобы set __ не возвращал "Переменная среды __ не определена"
- set __=0
- for /F "usebackq delims==" %%i in (`set __`) do set %%i=
- goto :eof
- :array_del_ifdef
- call :array_notdefined %1 __array_del_ifdef_result H
- if !__array_del_ifdef_result!==0 call :array delete %1
- goto :eof
- rem Проверка существования массива
- :array_notdefined
- rem Устанавливаем имя целевой переменной
- set __var=_l
- rem Тихая проверка - не выводить сообщение
- set __hide=0
- if not "%2"=="" (
- set __var=%2
- )
- if /i "%3"=="h" (
- set __hide=1
- )
- if not defined !__var! set /a !__var!=0
- rem Проверка существования переменной, содержащей размер
- if not defined array_%~1_count (
- if not !__hide!==1 echo Массив %~1 не определен
- set /a !__var!+=1
- )
- goto :eof
- rem Перевод набора индексов к виду ;1;62;2;5;6;
- rem чтобы можно было выполнять проверку наличия числа: ;%i%;
- rem call :to_intset набор [имя_целевой_переменной=_l]
- rem Пример:
- rem call :to_intset "1 4 76 , 56, 34 ,6" set
- rem echo %set%
- rem выведет: ;1;4;76;56;34;6;
- :to_intset
- rem Устанавливаем имя целевой переменной
- set __var=_l
- if not "%2"=="" (
- set __var=%2
- )
- rem Добавляем елементы набора к строке
- set __intset=
- for %%i in (%~1) do (
- set __intset=!__intset!;%%i
- )
- rem Закрывающая ;
- set __intset=!__intset!;
- rem Записываем результат
- call :set !__var! __intset
- set __intset=
- goto :eof
- rem Является ли значение(!) числом
- rem call :is_number значение [имя_целевой_переменной=_l]
- :is_number
- rem Устанавливаем имя целевой переменной
- set _var=_l
- if not "%2"=="" (
- set _var=%2
- )
- set _val=%~1
- set _newval=%~1
- rem Выход из цикла, а заодно и индикатор, потому что
- rem Если из цикла был совершён вынужденный выход, то значит число
- set _exit_loop_local=0
- rem Трюк в том, чтобы вырезать все цифры, и если останется пустая строка, то значит было число
- rem Подобную реализацию видел на каком-то сайте, посвящённом быдлокодерам, но вот здесь пригодилось
- for /l %%i in (0,1,9) do (
- if not !_exit_loop_local!==1 (
- rem Новое имя с новой подстановкой текущей цифры
- set _newname="_newval:%%i="
- call :set _newval !_newname!
- if "!_newval!"=="" (
- set _exit_loop_local=1
- )
- )
- )
- rem Записываем результат
- set !_var!=!_exit_loop_local!
- set _var=
- set _exit_loop_local=
- set _val=
- set _newval=
- set _newname=
- set _name=
- goto :eof
- rem Есть путь быстрее, но в случае передачи строки выводится сообщение об ошибке,
- rem которое никак не перехватить, однако определение всё же происходит
- rem set __tmp=
- rem set /a __tmp=%1
- rem if not defined __tmp (
- rem echo string
- rem ) else (
- rem echo number
- rem )
- rem Замена подстроки
- rem call :str_replace имя_исходной_переменной искомая_строка подстановка [имя_целевой_переменной=имя_исходной_переменной]
- rem set str=Привет, Маша. Как дела?
- rem call :str_replace str "как дела" "Как настроение" str2
- rem echo !str2!
- rem Результат: Привет, Маша. Как настроение?
- :str_replace
- rem Устанавливаем имена целевой и исходной переменных
- set _var=%1
- set _result=%1
- rem Искомая строка
- set _from=%~2
- rem Строка подстановка
- set _to=%~3
- if not "%4"=="" (
- set _result=%4
- )
- set _newvarname=!_var!:!_from!=!_to!
- call :set !_result! "!_newvarname!"
- set _var=
- set _result=
- set _from=
- set _to=
- set _newvarname=
- goto :eof
- rem Проверка наличия цисла в наборе
- rem Набор должен иметь вид ;3;645;12;56;7;0;
- rem В целевой переменной будет 1 в случае успеха, и 0 в противном случае
- rem call :str_contains имя_переменной_с_набором число [целевая_переменная=_el]
- :str_contains
- rem Устанавливаем имя целевой переменной
- set _var=_l
- if not "%3"=="" (
- set _var=%3
- )
- rem Новое имя переменной с подстановкой. имя_переменной:;число;=#
- rem таким образом заменяем число, окруженное ; на решётку
- set _newstr=%1:;%2;=#
- call :set _newstr "!_newstr!"
- rem Если число присутствует, то новое значение не совпадёт состарым,
- rem т.к. в новом искомое число будет заменено на решётку
- if not "!_newstr!"=="!%1!" (
- set !_var!=1
- ) else (
- set !_var!=0
- )
- set _var=
- set _newstr=
- goto :eof
- :exit
- ENDLOCAL
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement