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

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

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

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


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

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


Подскажите пожалуйста, как проверить, содержится ли в значении ключа реестра искомая строка (с использованием маски *text*) и если содержится, присвоить определённой переменной определённое значение.

Как прочитать реестр, я знаю:
Код: Выделить весь код
For /F "Tokens=2*" %%I In ('Reg Query HKCU\temp /V temp') Do ... %%J
Пробовал сам сделать, не чего не получилось...
Заранее благодарен.

Отправлено: 20:31, 26-09-2009

 

Ветеран


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

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


user_123, можете попробовать на основе такого:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

rem If HKCU\Console\FaceName like "Lucida Console" or "Consolas"? --> Set SomeVar to SomeValue1 else SomeValue2
for /f "skip=3 tokens=3* delims=	" %%i in ('reg.exe query "HKCU\Console" /v "FaceName"') do (
	(echo %%i|findstr.exe /r /i /c:".*consol.*">nul) && set SomeVar=SomeValue1|| set SomeVar=SomeValue2
)

echo Result: SomeVar=[%SomeVar%]
endlocal
exit /b 0
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:14, 26-09-2009 | #2



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

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


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


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

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


Iska, Спасибо.

Однако, не работает... Не зависимо от того, имеется ли искомая строка, или нет, всё время присваивается 2-ое значение переменной. Ошибок в синтаксисе CMD не находит... И предложенный Вами метод чтения ключа реестра тоже на работает (переменная вообще не получает значение), я написал это немного по-другому...

А если ключа реестра нет, то нет и значения у переменной тоже нет...

А, в целом, у меня так написано:
Код: Выделить весь код
For /F "Tokens=2*" %%I In ('reg query "<RegDir>" /v "<Key>"') do (
	(echo %%i|findstr /r /i /c:".*<text>.*">nul) && set <переменная1>=1|| set <переменная1>=0
)

Последний раз редактировалось user_123, 27-09-2009 в 00:56.


Отправлено: 00:27, 27-09-2009 | #3


Ветеран


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

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


Цитата user_123:
Однако, не работает...
Что могу сказать… У меня, приведённый мною код, работает корректно. Обычно я даже проверяю ещё раз после выкладывания, дабы постараться избежать нелепых опечаток/ошибок при копировании.

Сие может зависеть отчасти от версии reg.exe; Вы можете попробовать, как указывал amel27, не использовать «skip», а фильтровать выходной поток команды «reg.exe», только используя в качестве фильтра имя параметра:
Код: Выделить весь код
for /f "tokens=3* delims=	" %%i in ('reg.exe query "HKCU\Console" /v "FaceName"^|find.exe /i "FaceName"') do (
вместо
Код: Выделить весь код
for /f "skip=3 tokens=3* delims=	" %%i in ('reg.exe query "HKCU\Console" /v "FaceName"') do (
Цитата user_123:
А, в целом, у меня так написано…
А почему именно так? Ибо у меня команда (с реально существующими параметрами):
Код: Выделить весь код
for /f "tokens=2*" %i in ('reg.exe query "HKCU\Console" /v "FaceName"') do echo %i
выдаёт ожидаемое:
Цитата:
REG_SZ
В таком случае верните на место своё «echo %%j» (а не «%%i», как в моём примере), поскольку Вы используете «tokens=2*» (а я — «tokens=3*»), и у Вас «*» будет как раз в «%%j».
Цитата user_123:
А если ключа реестра нет, то нет и значения у переменной тоже нет...
Логично . Цитирую…
читать дальше »
…условие задачи, поставленное Вами же:
Цитата user_123:
…как проверить, содержится ли в значении ключа реестра искомая строка…
Про то, что требуется попутно проверять наличие самого раздела и/или параметра реестра (и как следует в этом случае поступать) — не упоминалось никоим образом.

Отправлено: 02:43, 27-09-2009 | #4


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


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

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


Iska, добавление
Код: Выделить весь код
^|find.exe /i "FaceName"
приводит к тому, что не присваивается ни 1, ни 2 переменная.

Дело действительно было в i / j. Поставил "j". Сначала не чего не изменилось... Как позже выяснилось проблема была в регистре "i".

т.е. надо было не так писать:
Код: Выделить весь код
For /F "Tokens=2*" %%I In (
а так:
Код: Выделить весь код
For /F "Tokens=2*" %%i In (
Спасибо большое за помошь.

Отправлено: 10:30, 27-09-2009 | #5


Ветеран


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

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


user_123, да, это так:
Цитата %systemroot%\help\ntcmds.chm:
For

* Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными и одновременно может быть активно не больше 52 переменных.
К сожалению, я не обратил на это отдельного внимания при рассмотрении кода из Вашего поста #3, поскольку сразу привёл формат Вашего кода у себя к строчным (в том числе и переменную «%%I»).

Отправлено: 10:58, 27-09-2009 | #6


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


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

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


Цитата Iska:
%systemroot%\help\ntcmds.chm »
У меня такого файла нет... vista x32.
Хотя папка help есть...

Подскажите пожалуйста ещё кое-что... Я не могу до конца разобраться в синтаксисе команды "findstr".
В значении ключа реестра, в котором ищется строка содержится путь к ехе-файлу (может быть в кавычках) и дополнительные ключи (параметры). Мне надо определить, содержит ли значение ключа следующее:
Код: Выделить весь код
*путь_к_файлу*парамтры_запуска*
и если всё соответствует (и путь, и параметры запуска) присвоить значение для переменной.

Смотрел findstr /?
Там сказано что для поиска нескольких строк надо писать через пробел... Но в данном случае условие определяется по принципу дизъюнкции (или), а мне надо, чтобы по принципу конъюкции (и).

Последний раз редактировалось user_123, 27-09-2009 в 14:33.


Отправлено: 12:59, 27-09-2009 | #7


Googler


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

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


Цитата user_123:
надо определить, содержит ли значение ключа следующее »
Код: Выделить весь код
FindStr /IRC:".*путь_к_файлу.*парамтры_запуска"
P.S. на самом деле из-за русских букв в строке поиска команда нерабочая, по нескольким причинам:

1. REG.EXE почти всегда возвращает значение в ANSI-кодировке (WIN), а для батника родной является OEM-кодировка (DOS), т.е. даже одинаковые строки в разных кодировках не совпадут;
2. Использование "CHCP 1251" не исправит ситуацию, т.к. FINDSTR неправильно перекодирует часть русских букв (в частности, "ь").

есть два варианта:

- набирать батник сразу в WIN кодировке, что нежелательно, т.к. может нарушить работу других команд;
- осуществлять перекодировку средствами самого батника, пример для "Test.TXT" в WIN-кодировке:
Код: Выделить весь код
@Echo Off

CHCP 1251 >Nul
Set $R=.*путь_к_файлу.*парамтры_запуска
CHCP 866  >Nul

Type Test.TXT|FindStr /VIRC:"%$R%"

Отправлено: 05:20, 28-09-2009 | #8


Ветеран


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

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


Цитата user_123:
Мне надо определить, содержит ли значение ключа следующее…*путь_к_файлу*парамтры_запуска*
и если всё соответствует (и путь, и параметры запуска) присвоить значение для переменной.»
Я могу Вам посоветовать попробовать использовать регулярные выражения (findstr.exe в аккурат под это дело предназначена) в строке поиска [ага, amel27 уже привёл пример на эту тему; надо было мне сразу читать по диагонали]. Будет гораздо проще, ежели Вы приведёте конкретные примеры.

Цитата amel27:
1. REG.EXE почти всегда возвращает значение в ANSI-кодировке (WIN)…
amel27, в консоль, насколько я понял, вывод идёт в текущей установленной кодовой странице, а вот при перенаправлении вывода в другую команду/файл — ANSI (я смотрел на MS WinXP SP3); правильно я понимаю? И, ещё, не могли бы Вы уточнить, для повышения квалификации, так сказать: Вы упомянули «…почти всегда» — подробнее можно? Каковы исключения, и в какую сторону?

Отправлено: 16:58, 28-09-2009 | #9


Googler


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

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


Iska, AFAIK ввод/вывод всегда ведется в текущей (CHCP) кодировке... но только если он выполняется штатными CMD-командами, при вызове внешних EXE результат целиком зависит них, по идее они должны перед вводом/выводом проверять текущую кодировку и приводить поток к ней, на деле можно ждать всё что угодно - "метод тыка" рулит

Цитата Iska:
подробнее можно? Каковы исключения, и в какую сторону? »
хз... например, следующая команда корректно перекодирует в OEM и отображает русский текст параметра HKCU\test (REG_SZ) в Win2003 ENU (русская локаль), но в XP RUS («…почти всегда») на выходе имеем ANSI:
Код: Выделить весь код
reg query hkcu /v test|find /v ""
З.Ы. кроме того, никто не мешает сохранить в реестре OEM-текст, как ANSI - попадались и такие случаи

Отправлено: 04:26, 29-09-2009 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Система - поиск программы по сравнению реестра seman Программное обеспечение Windows 7 30-06-2009 20:38
HDD - Hitachi HDP725050GLA360 непонятные некоторые значени SMART Das_Monster Накопители (SSD, HDD, USB Flash) 9 08-06-2009 14:10
CMD/BAT - [решено] удаление ключа реестра через определенное время drgr Скриптовые языки администрирования Windows 4 03-03-2009 08:30
как бы добавить в переменные имя ключа реестра и его значение ? mitiya Программирование и базы данных 21 23-04-2008 11:54
Доступ - Авто экспорт значения ключа из реестра Billy Bones Microsoft Windows 2000/XP 3 26-07-2007 11:50




 
Переход