Показать полную графическую версию : Изменение значения ключа реестра по правилу.
heretique
22-03-2013, 23:11
Есть ключ реестра, находящийся в HKLM\путь , имя Имя, значение чтото_хвостик. Нужно перезаписать значение, убрав все начиная с _ (нижнего подчеркивания). Помогите плз.
heretique
23-03-2013, 08:57
set key="HKLM\SYSTEM\CurrentControlSet\services\Tcpip\Parameters"
set val="Hostname"
for /f "delims=_" %%a in ('reg query %key% /v %val%^|find %val%') do (
for %%b in (%%a) do set secs=%%b )
reg add "%key%" /f /v "Hostname" /d "%secs%"
Проблема в том, что находит в _ типе (REG_SZ) и выдает на выходе REG. Как сделать, чтоб обрабатывал только значение?
Dragokas
26-03-2013, 03:40
Какая версия ОС?
heretique
26-03-2013, 10:08
Windows 7
Dragokas
28-03-2013, 21:30
Внимание! Перед применением скрипта обязательно:
1) Создайте контрольную точку восстановления системы.
2) Экспортируйте оперируемую ветвь реестра в файл .reg
Ограничения кода:
- Значение параметра не должно начинаться со знака разделителя (_), иначе будет перезаписано значением не до, а после этого знака.
- Код работает только в OS ver. >= Vista.
::Код предназначен только для работы в OS ver. >= Vista.
@echo off
SetLocal EnableDelayedExpansion EnableExtensions
::Куст, в котором ищем
Set Hive=hkcu\software\myroutine
::Искомое имя параметра (опциональный фильтр)
::Set Param=NameServer
::Разделитель в значении параметра (начиная с него вся часть будет отрезана и перезаписана)
Set Delim=_
rem Получаем имена параметров куста (рекурсивный обход)
for /f "delims=" %%K in ('reg query "%Hive%" /s /f "*" /k ^| find "HKEY"') do (
rem Получаем подробности: имя параметра/тип значения/значение
for /f "delims=" %%V in ('reg query "%%K" /f "*" /d ^| find "REG"') do (
rem 4 пробела заменяем на табуляцию
set "key=%%V"& set "key=!key: = !"
rem Парсим по знакам табуляции
for /f "tokens=1-2* delims= " %%N in ("!key!") do (
Rem Здесь: %%N - имя параметра, %%O - тип значения, %%P - значение
Rem Получаем фильтр имени параметра, если он задан
if Defined Param (Set ParamFilter=%Param%) else (Set ParamFilter=%%N)
Rem Применяем этот фильтр
if "%%N"=="!ParamFilter!" (
Rem Убеждаемся, что искомый разделитель есть в значении
echo.%%P|>nul find "%Delim%"&& (
Echo Found %%K %%P
Rem Отрезаем часть - до разделителя
for /f "tokens=1 delims=%Delim%" %%z in ("%%P") do (
Echo Changing to %%z
reg add "%%K" /v "%%N" /t %%O /d "%%z" /f
)
)
)
)
)
)
pause
- Код работает только в OS ver. >= Vista. »
Чем вызвано сие ограничение?
Dragokas
28-03-2013, 21:39
В reg.exe version 3.0 (смотрел на XP x32 en) отсутствуют ключи /f /k в запросе query. Кроме того, формат выходящих данных отличается, что в нашем случае критично для разбора под циклом.
Простите, но универсальной конструкции для сканирования реестра в обеих системах не знаю (еще не придумал).
Diskretor, спасибо, ясно.
@Echo Off
Set key="HKLM\SYSTEM\CurrentControlSet\services\Tcpip\Parameters"
Set val="Hostname"
Set delm=_
For /f "tokens=2*" %%a In ('Reg Query %key% /v %val%^|Find %val%') Do Set secs=%%b
Call Set nsecs=%%secs:*%delm%=%%
Call Set nsecs=%%secs:%delm%%nsecs%=%%
:: Слово Echo удалить после проверки
Echo If Not "%secs%"=="%nsecs%" Reg Add %key% /v %val% /d "%nsecs%" /f
Pause
heretique
29-03-2013, 10:00
gora, спасибо!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.