Компьютерный форум 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=172930)

vdereberya 12-04-2010 14:44 1390789

Поиск и удаление значения в реестре
 
Здравствуйте!
Помогите в решении проблемы.
Задача такова: требуется сценарий (или пакетный файл), который бы искал, и удалял параметр из реестра. Заранее неизвестно где будет прописан нужный параметр, и как он будет назван. Известно его значение (например Totalcmd.exe). Помогите плиз, очень нужно!

amel27 13-04-2010 06:13 1391284

Цитата:

Цитата vdereberya
неизвестно где будет прописан нужный параметр, и как он будет назван »

какого типа параметр и в каком разделе (HKLM/HKCU/...) тоже неизвестно?.. можно просто выгрузить весь реестр в текстовый файл и выполнить построчный поиск, либо использовать сторонние утилиты типа RegFind из ресурскита Windows 2000, пример:

Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Call :RegValFind HKEY_USERS "%COMPUTERNAME%"
If Defined $KEY Echo REG DELETE "%$KEY%" /v "%$VAL%" /f

Exit /B

:RegValFind
For /F "Tokens=1* Delims==" %%i In ('2^>Nul regfind -y -i 0 -p %~1 %~2') Do (
If "%%j"=="" (If %%i==%~1 (Set $KEY=%~1) Else Set $KEY=!$KEY!\%%i) Else (
Set $VAL=%%i& Set $VAL=!$VAL:~0,-1!& Exit /B ))


sov44 03-07-2011 17:48 1706162

Необходимо в реестре проверить содержимое разделов startupreg, startupfolder на наличие в них параметров и подразделов, в случае наличия параметров и подразделов, их удалить.
Код:

HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg
HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder


amel27 03-07-2011 18:54 1706177

sov44, а не проще вместо проверки тупо удалить/создать всю ветку?

sov44 03-07-2011 19:35 1706187

amel27, конечно проще, сделано так
Код:

@echo off
Reg delete "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg" /f
Reg delete "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder" /f
Reg add "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg" /f
Reg add "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder" /f

и так
Код:

@echo off
reg delete "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg" /va /f
for /f "skip=4 delims=" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg"') do reg delete "%%i" /f
 
reg delete "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder" /va /f
for /f "skip=4 delims=" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder"') do reg delete "%%i" /f

однако планирую добавить этот кусок в скрипт удаления временных файлов, который запускаю в день иногда по несколько раз. Хорошо ли будет по несколько раз в день сносить разделы startupreg, startupfolder ?

sov44 03-07-2011 19:52 1706198

решение подсказали
Код:

@echo off
goto :start
:fn1
set n=--
for /f "skip=4 delims=" %%i in ('reg query %1') do (set n="%%i" & goto :next)
:next
if "%n:~1,1%"==" " reg delete %1 /va /f
for /f "skip=4 delims=" %%i in ('reg query %1') do reg delete "%%i" /f
exit /b
:start
call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg"
call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder"


yurfed 03-07-2011 20:10 1706204

Цитата:

Цитата vdereberya
ребуется сценарий (или пакетный файл), который бы искал, и удалял параметр из реестра. Заранее неизвестно где будет прописан нужный параметр, и как он будет назван. »

Хоть тема и была создана ещё в 2010, но отзывы ещё не потеряли актуальность, попробую ответить.
Вы понимаете в какую байду ещё ввязались? Всё, что было озвучено в просьбе - полный бред
Цитата:

Цитата vdereberya
Заранее неизвестно где будет прописан нужный параметр, и как он будет назван. Известно его значение (например Totalcmd.exe) »

Типа - иди туда, не знаю куда. Принеси то, не знаю что.
По сути это целый проэкт, довольно ответственный, лезть в реестр и что-то там исправлять и искать.
Такие вещи делаются не с кандачка и не с коленки.
и то, что вам подсказали -
Цитата:

Цитата sov44
решение подсказали »

- полная ерунда
Я не умоляю знаний подсказавших хелперов, но ребята, будьте более в реальности, чем в своих кодах.

sov44 03-07-2011 20:18 1706207

Цитата:

Цитата yurfed
будьте более в реальности, чем в своих кодах »

А теперь по-русски.

yurfed 03-07-2011 20:23 1706209

Цитата:

Цитата sov44
А теперь по-русски. »

Вы полагаете что скрипты, которые предлагаются, во всём хороши?
Цитата:

Цитата sov44
А теперь по-русски. »

Хотите на албанском, если ещё не поняли?

sov44 03-07-2011 20:36 1706215

Цитата:

Цитата yurfed
Вы полагаете что скрипты, которые предлагаются, во всём хороши? »

предложте свой
Цитата:

Цитата yurfed
Хотите на албанском, если ещё не поняли? »

откуда такая спесь? пофлудим?

yurfed 03-07-2011 20:41 1706218

sov44, вы побазарить или мимо проходили?
Завязываем флуд, не относящийся к теме. Ок?
Отвечать не обязательно.

amel27 04-07-2011 08:07 1706443

Цитата:

Цитата sov44
Хорошо ли будет по несколько раз в день сносить разделы startupreg, startupfolder ? »

Если работает - не вижу препятствий... Единственный случай, когда этот способ может не подойти - наличие специальных прав на ветку, которые нужно сохранить (при удалении ветки права удаляются).
Цитата:

Цитата sov44
решение подсказали »

- удаляет все ключи и лишь один параметр (тот что "по умолчанию"), это и нужно?
- может не работать на других версиях Windows (значение в "skip=4")

sov44 09-09-2011 13:52 1749599

Цитата:

Цитата amel27
- может не работать на других версиях Windows (значение в "skip=4") »

а как надо? Подскажите.
ещё вопрос, есть код ( вроде работает :) )
Код:

rem Удаление не запускаемых приложений в окне msconfig с проверкой их наличия
rem блок скрипта настроен на работу до 10 числа каждого месяца

set "tmr=%date:~0,2%"
If %tmr% LEQ 10 (

call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg"
call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupfolder"

:fn1
set n=--
for /f "skip=4 delims=" %%i in ("'reg query %1'2>Nul" ) do (set n="%%i" & goto :next)

:next
if "%n:~1,1%"=="H" (
reg delete %1 /va /f  1>Nul 2>&1
for /f "skip=4 delims=" %%i in ('reg query %1') do reg delete "%%i" /f 1>Nul 2>&1
)
  )

как правильно записать отправку в nul
Код:

"'reg query %1'2>Nul"
или
Код:

"'reg query %1'2^>Nul"
???

El Sanchez 09-09-2011 15:19 1749689

Цитата:

Цитата sov44
а как надо? Подскажите. »

Перенаправить вывод команды на вход Find/Findstr, например, reg query параметры|find /i "REG_SZ"
Цитата:

Цитата sov44
как правильно записать отправку в nul »

Код:

...('reg query %1 2^>nul')...

sov44 09-09-2011 15:53 1749713

Цитата:

Цитата El Sanchez
Перенаправить вывод команды на вход Find/Findstr »

покажите на примере, я пока не силён в cmd.

El Sanchez 11-09-2011 17:50 1750882

Цитата:

Цитата sov44
покажите на примере »

sov44, прочитать, запомнить, воспроизвести. Буду спрашивать :)
Пример

По сути подавляющее большинство батников представляет собой циклическую обработку результатов вывода команды, содержащего нам нужную информацию. К сожалению вывод команды редко дает сразу нужный результат в нужном виде, поэтому фильтровать вывод необходимо. В качестве примера будем определять букву системного диска из реестра Windows 7/Windows XP.

Буква системного диска находится в реестре в кусте HKEY_CURRENT_USER\Volatile Environment, строковый (REG_SZ) параметр HOMEDRIVE. Определим значение этого параметра при помощи утилиты командной строки reg.exe, синтаксис которой можно посмотреть в справке reg.exe /?.
Результат вывода в WinXP:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE

! REG.EXE VERSION 3.0

HKEY_CURRENT_USER\Volatile Environment
    HOMEDRIVE  REG_SZ  C:


c:\temp>


Результат вывода в Win7:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE

HKEY_CURRENT_USER\Volatile Environment
    HOMEDRIVE    REG_SZ    C:


c:\temp>


Видите разницу в выводах одной и той же команды? Количество строк неодинаково и строка с версией reg.exe в выводе для WinXP. Дело в разных версиях reg.exe в Win7 и WinXP, формирующих свой вывод по-разному, поэтому дальнейший разбор вывода командой for с указанием пропуска первых 4 строк вывода skip=4 на Win7 закончится ничем - for пропустит нужную нам строку. Вывод: результат нужно фильтровать, выделив нужную строку. Сделать это можно, используя команды find или findstr, перенаправив результат reg на вход команды find или findstr при помощи оператора piping (|). Используем find:
Результат вывода:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE|find "REG_SZ"
    HOMEDRIVE    REG_SZ    C:

c:\temp>


"REG_SZ" - ищем строку с буквой по чему-нибудь, что отличает искомую строку от всех остальных. Все, строка найдена, причем независимо от ОС результат будет одинаковым.

Кстати, заменим Find "REG_SZ" на команду Findstr /N $ и посмотрим, на результат в WinXP и Win7. Параметр /N пронумерует обрабатываемые строки, а $ - шаблон для поиска, означающий, что будет произведен поиск строк, заканчивающихся на символ конца строки, а это все строки, включая пустые, т.е. просто посмотрим сколько строк вернет reg.exe в разных версиях Windows.
Результат вывода в WinXP:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE|findstr /n $
1:
2:! REG.EXE VERSION 3.0
3:
4:HKEY_CURRENT_USER\Volatile Environment
5:    HOMEDRIVE REG_SZ  C:
6:

c:\temp>


Результат вывода в Win7:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE|findstr /n $
1:
2:HKEY_CURRENT_USER\Volatile Environment
3:    HOMEDRIVE    REG_SZ    C:
4:

c:\temp>


Теперь видите, почему for с "skip=4" для WinXP получит искомую строку, а Win7 нет? Поэтому мы и пропустили результат reg через find. Но это не все. Что будет, если запрашиваемого параметра нет или куст указан несуществующий? Внесем изменения, добавив к HOMEDRIVE любой символ, например 1.
Результат вывода в WinXP:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE1|find "REG_SZ"

Ошибка: Системе не удалось найти указанный раздел или параметр реестра

c:\temp>


Результат вывода в Win7:

Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE1|find "REG_SZ"
Ошибка: Не удается найти указанный раздел или параметр в реестре.

c:\temp>


В for это сообщение для обработки даже не попадет, т.к. принадлежит потоку StdErr команды reg, for же работает с StdOut, потоком, выводящим результат на экран в случае успешной отработки команды. Выход - перенаправить StdErr не на экран (значение по умолчанию), а в устройство nul, т.е. в никуда:
Результат вывода
:
Код:

c:\temp>reg query "HKCU\Volatile Environment" /v HOMEDRIVE1 2>nul|find "REG_SZ"

c:\temp>


, где 2>nul и есть перенаправление StdErr (дескриптор потока StdErr равен 2, StdOut равен 1) в никуда. На экране ничего, хотя параметра HOMEDRIVE1 не существует.

Итак, строка найдена, теперь остается отделить букву диска от ненужных HOMEDRIVE, REG_SZ и пробелов. Для этого и нужна команда for, которая с параметром /f позволяет работать с результатом вывода других команд. Взглянем на нашу строку: " HOMEDRIVE REG_SZ C:" (привел в кавычках). Ее можно представить как строку с 3 подстроками (словами), разделенных пробелами. Осталось только указать for-у ключ разбора строки tokens=3 - делить строку на 3 части, 3-я подстрока в переменную (ключ delims (символ разделителя подстрок) не нужен, т.к. символы пробела и табуляции используется по умолчанию в качестве разделителей, а подстроки в нашей строке отделены пробелами) и вывести результат на экран или присвоить какой-либо переменной.
Результат вывода:

Код:

c:\temp>for /f "tokens=3" %a in ('reg query "HKCU\Volatile Environment" /v HOMEDRIVE 2>nul|find "REG_SZ"') do set drive=%a
Непредвиденное появление: 2>.

c:\temp>


Вот так облом, совсем не то, что ожидали увидеть, ведь интерпретатор решил, что была предпринята попытка перенаправления StdErr, а синтаксис for-а не закончился и нарушился. Чтобы указать интерпретатору, что символ > (как и |) являются частью синтаксиса for, а не попыткой перенаправления (>) или piping-а (|), нужно экранировать эти спецсимволы символом ^:
Результат вывода:

Код:

c:\temp>for /f "tokens=3" %a in ('reg query "HKCU\Volatile Environment" /v HOMEDRIVE 2^>nul^|find "REG_SZ"') do set drive=%a

c:\temp>set drive=C:

c:\temp>


Все, переменная drive теперь содержит букву диска.

sov44 24-09-2011 10:14 1759244

El Sanchez, благодарю за полезный мануал, некоторое время был в отпуске, поэтому не сразу ответил в теме :)

С толкнулся с проблемой найти подраздел реестра в startupreg, startupfolder.
Код:

call :fn1 startupreg
call :fn1 startupfolder
:fn1

for /f %%A In ('Reg Query "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\%1" /v %1^|Find "*"') Do set drt=%%A

echo %drt%
pause


sov44 26-09-2011 18:45 1760564

Неужели никто не подскажет, как вывести на экран и удалить содержимое startupreg, startupfolder? :not-me:

Iska 27-09-2011 13:53 1761004

sov44:
1) зачем и надо ли выводить на экран?
2) поскольку разрешения у данных подразделов унаследованы, самое простое и надёжное — #4.

sov44 27-09-2011 16:29 1761151

Iska, Интересно понять, как вывести содержимое разделов реестра и выполнить над ними операции. Возможно пригодится для решения других задач.

Iska 27-09-2011 18:09 1761231

Тогда это:
Код:

Reg Query "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\%1" /v %1
неверно. Вы пытаетесь внутри «HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg» найти параметр «startupreg».

qulq 12-06-2012 09:16 1932719

Здравствуйте!

Возник вопрос.
Необходимо создать батник для поиска параметра "OLGТ" в реестре, например:
HKEY_CLASSES_ROOT\CLSID\{FFGH7029-84D7-4E1E-BE44-B0019BC54J9D}

и добавления в раздел {FFGH7029-84D7-4E1E-BE44-B0019BC54J9D}
два новых строковых параметра - "Find" и "Conf" с произвольными значениями в каждом, например: "xxxxxxxx"

Единственное, {GUID} - {FFGH7029-84D7-4E1E-BE44-B0019BC54J9D} на разных компьютерах отличается, но в нем присутствует во всех случаях параметр "OLGТ" по которому его можно будет обнаружить.

Путь до "OLGТ" в 64-х битной системе может быть такой HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{GUID}

Спасибо за ответ.

sov44 16-10-2012 23:58 2006817

Столкнулся с проблемой удаления куста реестра, если в имени куста присутствует кириллица. Подскажите решение.
Куст
HTML код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg]

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\Ярлык для страницы свойств High Definition Audio]
"key"="SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"
"item"="HDAShCut"
"hkey"="HKLM"
"command"="HDAShCut.exe"
"inimapping"="0"

код, который не видит кириллицу (кодировка естественно 866) и не удаляет куст
Код:

@echo off
SetLocal enabledelayedexpansion

call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg"
pause
exit /b

:fn1
for /f "tokens=7 delims=\" %%i in ('reg query %1') do reg delete "%~1\%%i" /f
exit /b


Petya V4sechkin 17-10-2012 07:58 2006893

sov44, в реестре кириллица в кодировке Windows-1251, так что:
Код:

chcp 1251
call :fn1 "HKLM\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg"



Время: 09:42.

Время: 09:42.
© OSzone.net 2001-