|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. |
|
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной.
|
Старожил Сообщения: 426 |
Профиль | Отправить PM | Цитировать Частенько приходится городить огород для получения достаточно простого результата.
1. Есть переменная, допустим set a=qwertyuiop Вопрос, как узнать ее длину? Сейчас мне приходится писать доп. функцию из 8 строк. 2. Есть переменная, нужно выделить из нее часть, но позиция/длина хранятся в других переменных и простое set b=%a:~%b%,%c% % и различные вариации не прокатят. 3. Некоторое время назад... (хорошо сказал ) в батнике мжно было проворачивать "макросы", т.е. присвоить переменной целую команду, затем в нужном месте вместо комады в строке стояла просто переменная, которая исполнялась по своему содержимому. С помощью такого "самомодифицирующегося кода" удавалось обойти некоторые ограничения. |
|
Отправлено: 17:26, 08-07-2009 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать 1. Увы, без процедур пока не выходит:
@Echo Off Call :StringLen "qwert yuiop" Echo %$StringLen% :StringLen :: ----------------------- :: Нахождение длины строки :: ----------------------- :: %1 - текстовая строка :: ----------------------- Set $StringLen=0&Set $StringBuf=%~1 If ""=="%~1" GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:~%$StringLen%%% If ""=="%$StringChr%" GOTO :EOF GoTo :StringLenLoop @Echo Off SetLocal EnableDelayedExpansion Set a=qwertyuiop Set b=1 Set c=2 Set d=!a:~%b%,%c%! Echo %d% |
Отправлено: 18:48, 08-07-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 426
|
Профиль | Отправить PM | Цитировать Забавно, в CALL /? нигде не упоминается такой забавный способ, как вызов ДОС-команды.
т.е. я просто использовал %$CMD% вместо Call %$CMD%. 2й вариант 2го пункта я в свое время пробовал с точностью наоборот, т.е. Set d=%a:~!b!,!c!%, и даже для правильности оборачивал его в проверку условия: if 0==0 Set d=%a:~!b!,!c!% и никакого результата на выходе. Не понимаю. Для 1го пункта пользуюсь такой заготовкой (по идее Ваш код должен выполняться быстрее, т.к. у меня более длинная операция над строкой, но писалось с учетом известных мне тогда возможностей): |
------- Отправлено: 19:30, 08-07-2009 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать |
Отправлено: 09:15, 09-07-2009 | #4 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать @ECHO OFF REM Var SET var=1234567890абвгдежзийabcdefghij#_ CALL :_Timer SET nn=0 :Loop SET /a nn+=1 REM ------------------------------ 2х строчный вариант ------------------------------ <NUL SET /p "ECHO=%var%" > "qwe.txt" FOR /F %%f IN ("qwe.txt") DO ( SET /a "zoo=%%~zf" ) REM DEL "qwe.txt" /f /q REM --------------------------------------------------------------------------------- IF "%nn%"=="1000" ( GOTO :EndLoop ) GOTO :Loop :EndLoop SET /a otimer=%timer% CALL :_Timer SET /a res=%timer% -%otimer% ECHO %res% ms PAUSE >NUL EXIT :_Timer FOR /F "usebackq tokens=*" %%f IN (`^<NUL TIME ^| FIND /i "’ҐЄг饥 ўаҐ¬п:"`) DO ( SET "timer=%%f" ) SET timer=%timer:~-11% SET /a timer=%timer:~0,2% *3600000 +%timer:~3,2% *60000 +%timer:~6,2% *1000 +%timer:~-2% *10 GOTO :EOF С раскоментированной строкой «DEL "qwe.txt" /f /q»: 5840 ms @ECHO OFF REM Var SET var=1234567890абвгдежзийabcdefghij#_ CALL :_Timer SET nn=0 :Loop SET /a nn+=1 REM ------------------------------ 6ти строчный вариант ----------------------------- SET $StringLen=0 :StrLoop SET /a $StringLen+=1 CALL SET $StringChr=%%var:~%$StringLen%%% IF "%$StringChr%"=="" ( GOTO :EndStrLoop ) GOTO :StrLoop :EndStrLoop REM --------------------------------------------------------------------------------- IF "%nn%"=="1000" ( GOTO :EndLoop ) GOTO :Loop :EndLoop SET /a otimer=%timer% CALL :_Timer SET /a res=%timer% -%otimer% ECHO %res% ms PAUSE >NUL EXIT :_Timer FOR /F "usebackq tokens=*" %%f IN (`^<NUL TIME ^| FIND /i "’ҐЄг饥 ўаҐ¬п:"`) DO ( SET "timer=%%f" ) SET timer=%timer:~-11% SET /a timer=%timer:~0,2% *3600000 +%timer:~3,2% *60000 +%timer:~6,2% *1000 +%timer:~-2% *10 GOTO :EOF |
|
------- Отправлено: 23:18, 06-07-2010 | #5 |
Новый участник Сообщения: 20
|
Профиль | Отправить PM | Цитировать |
Отправлено: 05:17, 05-06-2013 | #6 |
Старожил Сообщения: 207
|
Профиль | Отправить PM | Цитировать делюсь бриллиантом
::=========================================================================== :StrLen ::=========================================================================== :: %1=VarName (not VALUE), ret !strLen! set StrLen.S=A!%~1! set StrLen=0 for /L %%P in (12,-1,0) do ( set /a "StrLen|=1<<%%P" for %%I in (!StrLen!) do if "!StrLen.S:~%%I,1!"=="" set /a "StrLen&=~1<<%%P" ) goto :eof |
------- Отправлено: 00:26, 08-06-2013 | #7 |
Новый участник Сообщения: 4
|
Профиль | Отправить PM | Цитировать |
Отправлено: 19:58, 31-01-2019 | #8 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Проверка по переменной | ware | Скриптовые языки администрирования Windows | 18 | 06-11-2019 01:01 | |
[решено] Объявление переменной | DenNC | AutoIt | 3 | 28-06-2009 13:58 | |
[решено] Отсечение части переменной | morgan1991 | AutoIt | 3 | 06-04-2009 03:00 | |
[решено] Считывание параметров переменной | morgan1991 | AutoIt | 3 | 07-03-2009 14:38 | |
C/C++ - Выполнение кода и выделение памяти для переменной | Mr666 | Программирование и базы данных | 2 | 14-06-2008 15:19 |
|