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

Аватара пользователя
V!RTuE

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

Сообщение V!RTuE »

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
Аватара пользователя
V!RTuE

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

Сообщение V!RTuE »

Разобрался вроде.

Добавил в начале:



Код:

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

set "xx="

и далее добавил проверку:



Код:

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

if "%xx%" == "" GoTo :SKIP

Полностью код выглядит у меня так:



Код:

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

:: Показать список клиентов
	CALL :EchoColor 6 "	Список клиентов:"&echo.
	echo.
	set "xx="
	Set /A y=0
	FOR /F "usebackq skip=1 tokens=1,7 delims=/" %%i In ("%indextxt%") 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 (CALL :EchoColor 4 "[X] Клиентские сертификаты [НЕ НАЙДЕНЫ]"&echo. &echo.)
	if "%xx%" == "" GoTo :SKIP
	Set /A y=0
	FOR /F "usebackq tokens=2 delims==" %%i In (`Set "x@@"^|Sort`) DO (
		Set /A y+=1
		Call Set "@@%%y%%=%%i"
	)
	FOR /L %%i In (1,1,%y%) Do (Set "xx=     %%i"&Call Echo %%xx:~-4%%. %%@@%%i%%)
	:SKIP
Аватара пользователя
megaloman

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

Сообщение megaloman »

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)
	FOR /F "usebackq skip=1 tokens=1,7 delims=/" %%i In ("%FileIn%") DO (
		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%% [ОТОЗВАН]"
	)
	>nul 2>&1 Set "x@@" ||(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
Аватара пользователя
V!RTuE

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

Сообщение V!RTuE »

megaloman, всё-равно появляется ошибка. Так как у меня в 2 местах подобный скрипт используется. Первое - это когда надо отозвать сертификат, то там при не нахождении искомой записи скрипт должен завершить работу (точнее вернуться в предыдущий пункт меню).

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



Скрытый текст

[spoiler]Код:
[/spoiler]

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

: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%"







поэтому если и не найдено записей, то я решил, что проще пропустить часть кода, сделав соответствующую метку и перейдя сразу к ней. Ну и надо учитывать, что не закрывая скрипт может потребоваться несколько раз выполнять этот код. и могут как присутствовать записи о сертификатах, так и нет. Чтобы не принимало %xx% старое значение я каждый раз присваиваю ему пустое значение.

Вот исправил, как вы написали.



Исполняемый код:

[spoiler]Код:
[/spoiler]

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

	:: Показать список клиентов
	CALL :EchoColor 6 "	Список клиентов:"&echo.
	echo.
	FOR /F "usebackq skip=1 tokens=1,7 delims=/" %%i In ("%indextxt%") DO (
		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%% [ОТОЗВАН]"
	)
	>nul 2>&1 Set "x@@" ||(CALL :EchoColor 4 "[X] Клиентские сертификаты [НЕ НАЙДЕНЫ]"&echo. &echo.)
	Set /A y=0
	FOR /F "usebackq tokens=2 delims==" %%i In (`Set "x@@"^|Sort`) DO (
		Set /A y+=1
		Call Set "@@%%y%%=%%i"
	)
	FOR /L %%i In (1,1,%y%) Do (Set "xx=     %%i"&Call Echo %%xx:~-4%%. %%@@%%i%%)
	:SKIP
	CALL :EchoColor 3 "================================================================================"&echo.
	echo.









Вот результат:

[spoiler]Цитата:[/spoiler]



Список клиентов:



[X] Клиентские сертификаты [НЕ НАЙДЕНЫ]



Переменная среды x@@ не определена

================================================================================









P.S.: Опубликовал полностью свой проект Изображение
VPN - OpenVPN-All-in-One - Скрипт,облегчающий создание серверной и клиентской части OpenVPN


Если будет желание и время разобраться, то прошу ознакомиться. Лучше там продолжить обсуждение.
Ответить

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