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

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

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

Пользователь


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

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


Изменения
Автор: Patroklos
Дата: 05-02-2018
Описание: поправки
Здравствуйте, подскажите какие способы есть отправить в переменную часть строки?
Например строка
Код: Выделить весь код
fast slow error password error garbage test text blabla
я хочу получить в переменной var слово password.
флагом будет слово error меду которыми находиться нужная информация.
Какие варианты есть? FOR такой делимитер можно подсунуть?
Или findstr регуляркой какой нибудь можно вытащить?
Делимитер очень желательно слово или ряд символов. Например ###

Отправлено: 17:36, 05-02-2018

 

Ветеран


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

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


допустим так, хоть и не коротко:
Код: Выделить весь код
@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 сделает на ура и моргнуть не успеете.

Последний раз редактировалось alpap, 06-02-2018 в 12:37.

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

Отправлено: 12:13, 06-02-2018 | #2



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

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


Пользователь


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

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


Спасибо, пока правда ничего не понятно. Но я назову все переменные "говорящими" для меня названиями и за пару дней осилю.
Насчёт PoSh давно уже думаю но нет у меня пока условий дотошно учиться. Увы.

Отправлено: 13:37, 06-02-2018 | #3


Ветеран


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

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


Цитата Patroklos:
правда ничего не понятно »
принцип такой:
- вашу строку бьем по пробелу и в файл
- даем номера строкам
- выбираем номера строк с нужным тегом
- забираем строку с номером между найденных номеров выше и помещаем в переменную
ничего сложного, но букафф много
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:07, 06-02-2018 | #4


Ветеран


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

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


конкретно для вашего случая (в смысле поиск слова в предложении между двумя одинаковыми тегами) и без временного файла
(можно и еще короче, но пойдет и так, так понятнее, хотя смотря для кого)
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:42, 06-02-2018 | #5


Ветеран


Contributor


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

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


Цитата alpap:
вашу строку бьем по пробелу и в файл »
Без файла. Оформил в виде процедуры. Избежал 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, 06-02-2018 в 17:30.

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

Отправлено: 17:20, 06-02-2018 | #6


Ветеран


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

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


вот короче
вторичным тегом выступает = , можно назначить свой, если такой символ будет неуместен по тексту (в смысле присутствует уже)
Код: Выделить весь код
@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
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:28, 06-02-2018 | #7


Пользователь


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

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


Круть! Спасибо. Чувствую я так и профессором "батаники" стану.
Я плашку решено пока не буду ставить так как мне возможно понадобятся подсказки.
Поставлю чуть позже. Спасибо.

Отправлено: 09:45, 07-02-2018 | #8


Ветеран


Contributor


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

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


alpap, Краткость, несомненно, сестра таланта Но если текст будет вида "error password error garbage test text blabla" либо "fast slow error password error" Ваш батник отработает неверно.
Предлагаю длиннее, но с учетом этих имхо возможных случаев. Как и у Вас, батник работает в предположении, что между error и password не более одного пробела
Код: Выделить весь код
@Echo Off
cls

Set "Str=fast slow error password error garbage test text blabla"

Call :Password "%Str%" "error" "Pass"

Echo "%Pass%"
Pause
GoTo :Eof

:Password
	SetLocal
	Set "Dlm=ё"
	Set "Str=a %~1 a" &Set "Teg= %~2 "
	Call Set "Str=%%Str:%Teg%=%Dlm%%%"   
	EndLocal &FOR /F "tokens=2,3 delims=%Dlm%" %%i IN ("%Str%") DO If Not "%%j"=="" (Set "%~3=%%i") Else (Set "%~3=")
GoTo :Eof

В качестве вспомогательного разделителя я здесь указал ё, естественно, можно указать любой допустимый.
Set "Dlm=ё"
Однако, реально я тестировал батник с символом, который на клавиатуре пользователь, не обременённый излишними знаниями, не введёт. Например, символ ASCII с десятичным кодом 177. Я не смог разместить на форуме батник с этим символом (ломается весь текст сообщения), поэтому вынужденно указал ё.
Опять же, имхо выделение пароля - не основная цель в неизвестном нам батнике, поэтому я это оформил в виде процедуры, чтобы не загромождать основной текст кода
Простите, если излагаю известное
Чтобы вставить в текст символ ASCII с определённым десятичным кодом, надо на цифровой клавиатуре, удерживая клавишу Alt, набрать нужный код

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 08-02-2018 в 22:52.

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

Отправлено: 11:54, 07-02-2018 | #9


Ветеран


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

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


Цитата megaloman:
Но если текст будет ...»
естественно

Отправлено: 17:42, 07-02-2018 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
2010 - [решено] Выделить часть текста цветом в ячейке по шаблону на всем листе blackeangel Microsoft Office (Word, Excel, Outlook и т.д.) 14 24-05-2016 01:10
PowerShell - [решено] Выделить из строки текста слово определенной длины и записать в переменную Grafitchic Скриптовые языки администрирования Windows 14 16-07-2014 12:23
CMD/BAT - Последнее слово из строки в файле в переменную NoIZz Скриптовые языки администрирования Windows 2 23-10-2013 14:11
Офис и Текст - [решено] Как выделить строки с определенны символами KooDI Программное обеспечение Windows 2 03-03-2013 14:27
CMD/BAT - [решено] Чтение строки из файла в переменную Николя Скриптовые языки администрирования Windows 42 17-01-2010 19:42




 
Переход