Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной.

Ответить
Настройки темы
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной.

Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


Частенько приходится городить огород для получения достаточно простого результата.

1. Есть переменная, допустим set a=qwertyuiop Вопрос, как узнать ее длину? Сейчас мне приходится писать доп. функцию из 8 строк.

2. Есть переменная, нужно выделить из нее часть, но позиция/длина хранятся в других переменных и простое set b=%a:~%b%,%c% % и различные вариации не прокатят.

3. Некоторое время назад... (хорошо сказал ) в батнике мжно было проворачивать "макросы", т.е. присвоить переменной целую команду, затем в нужном месте вместо комады в строке стояла просто переменная, которая исполнялась по своему содержимому. С помощью такого "самомодифицирующегося кода" удавалось обойти некоторые ограничения.

Отправлено: 17:26, 08-07-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить 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
2. Два варианта:
Код: Выделить весь код
@Echo Off

Set a=qwertyuiop
Set b=1
Set c=2

Call Set d=%%a:~%b%,%c%%%
Echo %d%
Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

Set a=qwertyuiop
Set b=1
Set c=2

Set d=!a:~%b%,%c%!
Echo %d%
3. Вроде работает:
Код: Выделить весь код
@Echo Off

Set $CMD=DIR
Call %$CMD%
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:48, 08-07-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 426
Благодарности: 108

Профиль | Отправить PM | Цитировать


Забавно, в CALL /? нигде не упоминается такой забавный способ, как вызов ДОС-команды.
т.е. я просто использовал %$CMD% вместо Call %$CMD%.

2й вариант 2го пункта я в свое время пробовал с точностью наоборот, т.е. Set d=%a:~!b!,!c!%, и даже для правильности оборачивал его в проверку условия: if 0==0 Set d=%a:~!b!,!c!% и никакого результата на выходе. Не понимаю.

Для 1го пункта пользуюсь такой заготовкой (по идее Ваш код должен выполняться быстрее, т.к. у меня более длинная операция над строкой, но писалось с учетом известных мне тогда возможностей):
Код: Выделить весь код
@echo off
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion

call :Lenght qwertyuiop
echo %Len%
exit

:Lenght
set Len=0
set LenghtStr=%1
:Lenght1
if "%LenghtStr%"=="" exit /b
set LenghtStr=%LenghtStr:~0,-1%
set /a Len+=1
goto Lenght1

-------
Как сказало Дерево Дровосеку: "я - пень".


Отправлено: 19:30, 08-07-2009 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


вспомнил ещё один способ определения длины в две строки:
Код: Выделить весь код
@Echo Off
Set a=qwertyuiop

Echo.%a%>"%TEMP%\%~n0.tmp"
For %%i In ("%TEMP%\%~n0.tmp") Do Set /A z=%%~zi-2

Echo %z%
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:15, 09-07-2009 | #4


Аватара для na_PaLm

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить 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
Время выполнения: 4980 ms
С раскоментированной строкой «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
Время выполнения: 112270 ms (~ в 20 раз дольше при 32х символьной строке)

-------
ы


Отправлено: 23:18, 06-07-2010 | #5


Новый участник


Сообщения: 20
Благодарности: 1

Профиль | Отправить PM | Цитировать


По моему самое удачное от XGuest http://forum.script-coding.com/viewtopic.php?id=7949

Код: Выделить весь код
@echo off
 call :len var "строка"  &:: "var" - Переменная куда вернуть значение
 echo Длина строки: %var%                      
goto :eof

:len
 set len=%~2
 if not "%len%"=="" set /a %1+=1 & call :len %1 "%len:~1%"
goto :eof

Отправлено: 05:17, 05-06-2013 | #6


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить 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
Благодарности: 2

Профиль | Отправить PM | Цитировать


1.
Код: Выделить весь код
:LEN :: Длина строки
set "STRING=%STRING:~0,-1%" && set /a "LEN+=1"
if defined STRING goto LEN
Переменная STRING стирается, т.е. является временной
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:58, 31-01-2019 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход