Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Изменение значения ключа реестра по правилу. (http://forum.oszone.net/showthread.php?t=256901)

heretique 22-03-2013 23:11 2116618

Изменение значения ключа реестра по правилу.
 
Есть ключ реестра, находящийся в HKLM\путь , имя Имя, значение чтото_хвостик. Нужно перезаписать значение, убрав все начиная с _ (нижнего подчеркивания). Помогите плз.

heretique 23-03-2013 08:57 2116736

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 2118640

Какая версия ОС?

heretique 26-03-2013 10:08 2118727

Windows 7

Dragokas 28-03-2013 21:30 2121019

Внимание! Перед применением скрипта обязательно:
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


Iska 28-03-2013 21:35 2121023

Цитата:

Цитата Diskretor
- Код работает только в OS ver. >= Vista. »

Чем вызвано сие ограничение?

Dragokas 28-03-2013 21:39 2121029

В reg.exe version 3.0 (смотрел на XP x32 en) отсутствуют ключи /f /k в запросе query. Кроме того, формат выходящих данных отличается, что в нашем случае критично для разбора под циклом.
Простите, но универсальной конструкции для сканирования реестра в обеих системах не знаю (еще не придумал).

Iska 29-03-2013 00:05 2121130

Diskretor, спасибо, ясно.

gora 29-03-2013 06:54 2121236

Код:

@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 2121296

gora, спасибо!


Время: 19:02.

Время: 19:02.
© OSzone.net 2001-