CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Аватара пользователя
Patroklos

CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение Patroklos »

Здравствуйте, подскажите какие способы есть отправить в переменную часть строки?

Например строка

Код:

Код: Выделить всё

fast slow error password error garbage test text blabla

я хочу получить в переменной var слово password.

флагом будет слово error меду которыми находиться нужная информация.

Какие варианты есть? FOR такой делимитер можно подсунуть?

Или findstr регуляркой какой нибудь можно вытащить?

Делимитер очень желательно слово или ряд символов. Например ###
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение alpap »

допустим так, хоть и не коротко:



Код:

Код: Выделить всё

@echo off
set "s=fast slow error password error garbage test text blabla"
set "teg=error"
set "f_in=file.txt"
>"%f_in%" (for %%a in (%s%) do @echo %%a)
setlocal enabledelayedexpansion
 <"%f_in%" (for /f "delims=[]" %%a in ('find /n "%teg%"') do @set/a n+=1& set s!n!=%%a& set/a nd=s1+1,kd=s2-1)
 <"%f_in%" (for /f "delims=" %%a in ('for /l %%a in ^(%nd%,1,%kd%^) do @find /n /v ""^|find "[%%a]"') do @set "s=%%a"& set "var=!s:*]=!")
setlocal disabledelayedexpansion
echo %var%
pause
exit

это просто часть кода из моей утилиты, взял не разбирая, скорее всего можно упростить для вашей задачи, так как там надо было текст выводить между тегами, а у вас всего слово



кстати подобное PoSh сделает на ура и моргнуть не успеете.
Аватара пользователя
Patroklos

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение Patroklos »

Здравствуйте ещё раз. Я посидел над вашими решениями, понял принципы и способы реализации и наконец то сдвинулся с места.

Спасибо вам большое. Теперь у меня очередная "глупая" проблема: я ищу строки в текстовом файле и в них ищу пароль.

Проблема что в файле может быть несколько паролей из которых мне нужен только первый. А он перезаписывается.

Существует ли какой либо способ выйти из FOR после того как результат получен? Как нибудь так?



Код:

Код: Выделить всё

for /f "tokens=2 delims=###" %%c in ("data.txt") do (
	set var=%%c
	if defined var ( Пока пока скрипт! )

проблема что у меня for-ы вложены и в результате ерунда.

Как прекратить FOR когда var дефайнет?
Аватара пользователя
Patroklos

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение Patroklos »

Цитата Patroklos:



правда ничего не понятно
CMD/BAT - [решено] Выделить часть строки и отправить в переменную




принцип такой:

- вашу строку бьем по пробелу и в файл

- даем номера строкам

- выбираем номера строк с нужным тегом

- забираем строку с номером между найденных номеров выше и помещаем в переменную

ничего сложного, но букафф много Изображение
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение alpap »

конкретно для вашего случая (в смысле поиск слова в предложении между двумя одинаковыми тегами) и без временного файла

(можно и еще короче, но пойдет и так, так понятнее, хотя смотря для кого)



Код:

Код: Выделить всё

@echo off
set "s=fast slow error password error garbage test text blabla"
set "teg=error"
setlocal enabledelayedexpansion
 for %%a in (%s%) do set /a n+=1& set $_!n!=%%a
 for /f "tokens=2 delims=_=" %%a in ('set $_^|find "%teg%"') do set /a sn=%%a-1
 for /f "tokens=2 delims==" %%a in ('set $_%sn%') do set "var=%%a"
 echo %var%
endlocal
pause
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение alpap »

Цитата alpap:



вашу строку бьем по пробелу и в файл
CMD/BAT - [решено] Выделить часть строки и отправить в переменную




Без файла. Оформил в виде процедуры. Избежал setlocal enabledelayedexpansion

В пароле не должно быть пробелов

Код:

Код: Выделить всё

@Echo Off
cls
Set "Str=fast slow errOr    password       Error garbage test text blabla"
Set "Teg=error"
Call :Password "%Str%" "Pass"
Echo "%Pass%"
pause
GoTo :Eof
:Password
	Set /A nTeg=0
	:Begin
	Set /A nTeg+=1
	FOR /F "tokens=%nTeg% delims= " %%i IN ("%Str%") DO If /I %Teg%==%%i GoTo :Cont
	GoTo :Begin
	:Cont
	Set /A nTeg+=1
	FOR /F "tokens=%nTeg% delims= " %%i IN ("%Str%") DO Set "%~2=%%i"
GoTo :Eof
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение megaloman »

вот короче

вторичным тегом выступает = , можно назначить свой, если такой символ будет неуместен по тексту (в смысле присутствует уже)



Код:

Код: Выделить всё

@echo off
set "s=fast slow error password error garbage test text blabla"
set "teg=error"
cmd /v/c for %%v in ("!s: %teg% ==!") do for /f "tokens=2 delims==" %%a in ("%%~v") do echo %%a
pause
Аватара пользователя
alpap

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение alpap »

вот короче

вторичным тегом выступает = , можно назначить свой, если такой символ будет неуместен по тексту (в смысле присутствует уже)



Код:

Код: Выделить всё

@echo off
set "s=fast slow error password error garbage test text blabla"
set "teg=error"
cmd /v/c for %%v in ("!s: %teg% ==!") do for /f "tokens=2 delims==" %%a in ("%%~v") do echo %%a
pause
Аватара пользователя
Patroklos

Re: CMD/BAT - [решено] Выделить часть строки и отправить в переменную

Сообщение Patroklos »

Круть! Спасибо. Чувствую я так и профессором "батаники" стану.

Я плашку решено пока не буду ставить так как мне возможно понадобятся подсказки.

Поставлю чуть позже. Спасибо.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»