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

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

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

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


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

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


Доброго времени суток Уважаемые!
Есть задача: Нужно в файле средствами CMD найти все строки совпадающие с заданным условием поиска в переменной %name% (это текст фамилия или часть названия организации) и ВСЕ найденные строки записать каждую в свою переменную для дальнейшего выбора пользователя нужной переменной (в виде cmd под цифрами 1,2,3 и т.д.) Пользователь выбирает и процесс идет дальше.

В принципе к Вам вопрос о том: каким образом записать все найденные варианты в каждый в свою переменную и сделать выбор под цифрами полученных результатов...

Отправлено: 11:15, 25-11-2019

 

Аватара для Elven

Ветеран


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

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


1. на cmd это решается долго, нудно, паскудно. Если есть возможность - лучше смотреть в пошик (обычно такая возможность есть, если нет - аргументы в студию). Вот даже здесь похожая задача решалась.
2. сейчас (а возможно даже уже) в тему заглянет Iska и затребует пример файла, или как минимум задаст вполне справедливые вопросы по кодироке и окончанию строк.

Последний раз редактировалось Elven, 25-11-2019 в 13:06.

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

Отправлено: 13:01, 25-11-2019 | #2



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

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


Ветеран


Contributor


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

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


Очередной вариант создания искусственного интеллекта на CMD
Код: Выделить весь код
@Echo Off
cls
	>nul Chcp 1251
	
	Set "FileIn=Z:\Box_In\Нужно в файле.txt"
	Set "name=СоБаКа"

	If Not Exist "%FileIn%" (
		Echo Файл "%FileIn%" не найден. &Echo.
		Pause
		Exit /B 2 
	) 

	Set /A i=0

	Echo Выбирайте номер варианта N (Enter -завершение работы):
	Echo.
	For /F "usebackq Skip=2 delims=" %%s In (`2^>nul Find /I "%name%" "%FileIn%"`) Do (
		Call Set /A i+=1
		Call Set "@@%%i%%=%%s"
		Call Echo %%i%%= %%s
	)
	If %i%==0 (
		Echo Подстрока "%name%" в файле "%FileIn%" не найдена  &Echo.
		Pause
		Exit /B 1 
	) 

	:Begin
		Echo.
		Set "NN="
		Set /P NN=N=
		If "%NN%"=="" Exit /B 0
		If %NN% GEQ 1 If %NN% LEQ %i% (Call Set "Select=%%@@%NN%%%" &GoTo :End)
		Echo Введено неверное значение "%NN%", введите верное: &GoTo :Begin
	:End
	Echo %Select%

Pause
Exit /B 0
Предполагал, что текстовый файл в кодировке 1251, следовательно и батник должен быть в кодировке 1251

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


Последний раз редактировалось megaloman, 25-11-2019 в 16:53.

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

Отправлено: 13:14, 25-11-2019 | #3


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


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

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


Цитата megaloman:
Очередной вариант создания искусственного интеллекта на CMD
Код:
@Echo Off
cls
>nul Chcp 1251
Set "FileIn=Z:\Box_In\Нужно в файле.txt"
Set "name=СоБаКа"
If Not Exist "%FileIn%" (
Echo Файл "%FileIn%" не найден. &Echo.
Pause
Exit /B 2
)
Set /A i=0
Echo Выбирайте номер варианта N (Enter -завершение работы):
Echo.
For /F "usebackq Skip=2 delims=" %%s In (`2^>nul Find /I "%name%" "%FileIn%"`) Do (
Call Set /A i+=1
Call Set "@@%%i%%=%%s"
Call Echo %%i%%= %%s
)
If %i%==0 (
Echo Подстрока "%name%" в файле "%FileIn%" не найдена &Echo.
Pause
Exit /B 1
)
:Begin
Echo.
Set "NN="
Set /P NN=N=
If "%NN%"=="" Exit /B 0
If %NN% GEQ 1 If %NN% LEQ %i% (Call Set Select=%%@@%NN%%% &GoTo :End)
Echo Введено неверное значение "%NN%", введите верное: &GoTo :Begin
:End
Echo %Select%
Pause
Exit /B 0
Предполагал, что текстовый файл в кодировке 1251, следовательно и батник должен быть в кодировке 1251 »
Наконец то супер)))) Спасибо огромноее!! Единственное не могу понять где в переменной Select появляется пробел в конце строки?

Отправлено: 14:55, 25-11-2019 | #4


Ветеран


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

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


Цитата ownsmir:
Единственное не могу понять где в переменной Select появляется пробел в конце строки? »
Например, вот здесь:
Скрытый текст
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:04, 25-11-2019 | #5


Ветеран


Contributor


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

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


Цитата ownsmir:
Единственное не могу понять где в переменной Select появляется пробел в конце строки? »
Виноват, спешка, присваивание надо делать в кавычках
Код: Выделить весь код
		If %NN% GEQ 1 If %NN% LEQ %i% (Call Set "Select=%%@@%NN%%%" &GoTo :End)

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

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

Отправлено: 16:55, 25-11-2019 | #6


Аватара для V!RTuE

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


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

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


megaloman, прошу помочь доработать ваш код.
Имеется текстовый файл следующего содержания:
index.txt
V 321223032921Z 01 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=server/name=server/emailAddress=mail@mail.ru
V 321223032955Z 02 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=admin/name=server/emailAddress=mail@mail.ru
V 321223035016Z 03 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=user1/name=server/emailAddress=mail@mail.ru
V 321223035451Z 04 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=user2/name=server/emailAddress=mail@mail.ru
R 321223041103Z 05 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=user3/name=server/emailAddress=mail@mail.ru
V 321223043210Z 06 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=user4/name=server/emailAddress=mail@mail.ru
V 321223045105Z 07 unknown /C=RU/ST=Msk/L=Msk/O=MyOrg/OU=server/CN=user5/name=server/emailAddress=mail@mail.ru

Требуется вывести нумерованный список пользовательских сертификатов (начиная со 2-ой строки, значение CN= до следующего разделителя /), кроме сертификата сервера (это первая строка) и к названию сертификата добавить [ОТОЗВАН], при условии, что первая буква в соответствующей имени сертификата строке, будет R. Если V, то ничего не добавлять к имени. Как это реализовать?
Просто вывести список пользовательских сертификатов получилось так, взяв за основу ваш код:
Код: Выделить весь код
@Echo Off
cls
	>nul Chcp 1251
	
	Set "indextxt=C:\Program Files\OpenVPN\easy-rsa\keys\index.txt"
	Set "word=name"

	If Not Exist "%indextxt%" (
		Echo Файл "%indextxt%" не найден. &Echo.
		Pause
		Exit /B 2 
	) 

	Set /A i=0

	Echo Введите номер, соответствующий сертификату, который требуется отозвать (Enter - завершение работы):
	Echo.
	For /F "usebackq tokens=13 Skip=3 delims=/=" %%s In (`2^>nul Find /I "%word%" "%indextxt%"`) Do (
		Call Set /A i+=1
		Call Set "@@%%i%%=%%s"
		Call Echo %%i%%. %%s
	)
	)
	If %i%==0 (
	cls
		Echo Пользовательские сертификаты не найдены  &Echo.
		Pause
		Exit /B 1 
	) 

	:Begin
		Echo.
		Set "NN="
		Set /P NN=N=
		If "%NN%"=="" Exit /B 0
		If %NN% GEQ 1 If %NN% LEQ %i% (Call Set "Select=%%@@%NN%%%" &GoTo :End)
		Echo Введено неверное значение "%NN%", введите верное: &GoTo :Begin
	:End
	Echo вы выбрали: %Select%

Pause
Exit /B 0
В итоге должно получиться так:
Цитата:
Введите номер, соответствующий сертификату, который требуется отозвать (Enter - завершение работы):

1. admin
2. user1
3. user2
4. user3 [ОТОЗВАН]
5. user4
6. user5

N=
и при выборе номера отображалось сообщение:
Цитата:
Вы выбрали %cert_name%
P.S.: powershell прошу не предлагать. крайне желательно именно средствами bat/cmd сделать.

Отправлено: 22:41, 01-01-2023 | #7


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Set "FileIn=Z:\Program Files\OpenVPN\easy-rsa\keys\index.txt"

	If Not Exist "%FileIn%" (Echo Файл "%FileIn%" не найден. &Echo. &Pause &Exit /B 2)
	
	Set /A y=0
	FOR /F "usebackq skip=1 tokens=1,7 delims=/" %%i In ("%FileIn%") DO (
		Set /A y+=1
		Set "xx=%%j"
		Call Set "@@%%y%%=%%xx:~3%%"
		Echo %%i| >nul 2>nul FindStr /B /I /C:"R"&&Call Set "@@%%y%%=%%xx:~3%% [ОТОЗВАН]"
	)
	If %y% EQU 0 (Echo Пользовательские сертификаты не найдены. &Echo. &Pause &Exit /B 1)

	Echo Введите номер, соответствующий сертификату, который требуется отозвать (Enter - завершение работы):
	Echo.
	FOR /L %%i In (1,1,%y%) Do (Set "xx=     %%i"&Call Echo %%xx:~-4%%. %%@@%%i%%)

	:Begin
		Echo.
		Set "NN="
		Set /P NN=Выбираем номер N=
		If "%NN%"=="" Exit /B 0
		If 1 LEQ %NN% If %NN% LEQ %y% (Call Set "Select=%%@@%NN%%%" &GoTo :End)
		Echo Введено неверное значение "%NN%", введите верное: &GoTo :Begin
	:End
	Echo вы выбрали: "%Select%"
pause
Exit /B

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


Последний раз редактировалось megaloman, 02-01-2023 в 08:00.

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

Отправлено: 07:51, 02-01-2023 | #8


Аватара для V!RTuE

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


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

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


megaloman, еще просьба есть. Возможно ли добавить сюда сортировку по имени в алфавитном порядке?
А так большое спасибо. Код работает отлично!

Отправлено: 07:05, 09-01-2023 | #9


Ветеран


Contributor


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

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


V!RTuE,
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Set "FileIn=Z:\Program Files\OpenVPN\easy-rsa\keys\index.txt"

	If Not Exist "%FileIn%" (Echo Файл "%FileIn%" не найден. &Echo. &Pause &Exit /B 2)
	
	Set /A y=0
	FOR /F "usebackq skip=1 tokens=1,7 delims=/" %%i In ("%FileIn%") DO (
		Set /A y+=1
		Set "xx=%%j"
		Call Set "x@@%%xx:~3%%=%%xx:~3%%"
		Echo %%i| >nul 2>nul FindStr /B /I /C:"R"&&Call Set "x@@%%xx:~3%%=%%xx:~3%% [ОТОЗВАН]"
	)
	If %y% EQU 0 (Echo Пользовательские сертификаты не найдены. &Echo. &Pause &Exit /B 1)

	Set /A y=0
	FOR /F "usebackq tokens=2 delims==" %%i In (`Set "x@@"^|Sort`) DO (
		Set /A y+=1
		Call Set "@@%%y%%=%%i"
	)

	Echo Введите номер, соответствующий сертификату, который требуется отозвать (Enter - завершение работы):
	Echo.
	FOR /L %%i In (1,1,%y%) Do (Set "xx=     %%i"&Call Echo %%xx:~-4%%. %%@@%%i%%)

	:Begin
		Echo.
		Set "NN="
		Set /P NN=Выбираем номер N=
		If "%NN%"=="" Exit /B 0
		If 1 LEQ %NN% If %NN% LEQ %y% (Call Set "Select=%%@@%NN%%%" &GoTo :End)
		Echo Введено неверное значение "%NN%", введите верное: &GoTo :Begin
	:End
	Echo вы выбрали: "%Select%"
pause
Exit /B

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

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

Отправлено: 17:48, 09-01-2023 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск нескольких строк в файле и запись их в переменную Alex S Скриптовые языки администрирования Windows 11 14-02-2019 18:59
CMD/BAT - поиск текста в файле и задание в переменную n0lkk Скриптовые языки администрирования Windows 5 03-10-2017 20:13
CMD/BAT - [решено] поиск файла по маске и запись этого имени в переменную ___dima___ Скриптовые языки администрирования Windows 20 18-06-2017 01:46
CMD/BAT - [решено] Поиск строк в файле и запись в новый файл vision-d Скриптовые языки администрирования Windows 17 06-10-2016 09:14
[решено] FileWriteLine - Поиск и запись в текстовом файле. nibble74 AutoIt 2 12-07-2016 12:56




 
Переход