Войти

Показать полную графическую версию : [решено] Удалить параметр реестра, содержащий определенные данные


BaerLinn
16-11-2009, 15:54
Хелп! Нужен батник, который бы удалял параметр реестра, содержащий определенную информацию.
Пример, ключ реестра [HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs], где сохраняется информация о введенных URL'ах. Не известно, какое имя будет иметь параметр, содержащий значение, скажем, http://udaff.com/. И нужно удалить этот параметр. Как? Хелп!

Iska
16-11-2009, 17:09
Попробуйте наподобие такого:
@echo off

set sKey=HKCU\Software\Microsoft\Internet Explorer\TypedURLs
for /f "delims= " %%i in ('reg.exe query "%sKey%" ^| find /i "www.microsoft.com"') do (reg.exe delete "%sKey%" /v "%%i" /f >nul)

Будут убраны все упоминания о «www.microsoft.com».

Вопрос лишь в том, будут ли работать параметры, лежащие ниже удаляемых? Допустим, мы нашли и удаляем параметр «url15», останутся ли после удаления рабочими значения из «url16», «url17», «url18» и т.д.? Не проверял.

NiOl
16-11-2009, 19:26
начал извращаться с подпараметрами и не успел в первонахи ;) но раз уж добил - выкладываю

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

Url.bat udaff.com ya.ru
заменит строку http://udaff.com/ на ya.ru

а Url.bat udaff.com ya.ru +
заменит строку http://udaff.com/ на http://ya.ru/


@echo off
SetLocal EnableExtensions
SetLocal EnableDelayedExpansion
set SearchStr=%1
set ReplaceStr=%2
if "%1"=="" (
msg %username% "Use: %0 <Search URL SubString> <Replace Data> [+] where `+` = `smart Replace`"
exit 1
)

rem Рекурсивный вызов "Reg" иногда глючит - разносим Query и Add
Reg Query "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs" | Find /I "%SearchStr%" >%~dpn0.tmp

for /f "usebackq tokens=1,2,3" %%K in ("%~dpn0.tmp") do (
if "%3"=="+" (
set Data=%%M
set Data=!Data:%SearchStr%=%ReplaceStr%!
) else (
set Data=%ReplaceStr%
)
Reg Add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TypedURLs" /v "%%K" /t "%%L" /d "!Data!" /f
)

Iska
08-02-2011, 02:58
Из письма в ПМ:
Использовал ваш сценарий из http://forum.oszone.net/post-1271806-2.html
Изменил путь по которому ищется текст, но почему то не находит текст в ключах в которых есть пробелы. Помогите исправить.

Вопросы следует помещать именно на форум, ибо тут, помимо Iska, всегда найдётся более чем достаточное число людей, желающих и могущих помочь. А для правильного ответа потребуется следующее:

Приведите здесь Ваш, пусть и неработающий, код пакетного файла — тогда можно будет говорить предметно.

Ruslan-kam
08-02-2011, 03:36
И так есть путь в реестре в нём ключи со строковыми параметрами если ключ имеет вид "XXX", то батник работает как надо, если же ключ носит имя с пробелом "XXX XXX", то командная строка возвращает ошибку что такое значение не найдено. Нужно именно таким способом удалить несколько ключей к примеру "Mobile Partner"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"Mobile Partner"="C:\Program Files\MegaFon Internet\MegaFon Internet.exe"

Вот пример батника set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\
for /f "delims= " %%i in ('reg.exe query "%sKey%" ^| find /i "MegaFon"') do (reg.exe delete "%sKey%" /v "%%i" /f >nul)

Iska
08-02-2011, 10:43
Если Вам известно имя параметра раздела реестра — нет никакой нужды делать опрос и разбор, достаточно простого:
reg.exe delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Mobile Partner" /f

Ruslan-kam
08-02-2011, 20:40
Я не знаю какое имя будет у ключей. Я знаю только часть пути куда они ведут. В этом и загвоздка.

Поэкспериментировав установил что если в устанавливаемом командой set ключе убрать самый последний слэш, то батник начинает работать на половину. А именно:
Запускаем такой батник
set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
for /f "delims= " %%i in ('reg.exe query "%sKey%" ^| find /i "MegaFon"') do (reg.exe delete "%sKey%" /v "%%i" /f >nul)

То получаем такую ошибку
C:\>set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
C:\>for /F "delims= " %i in ('reg.exe query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" | find /i "MegaFon"') do (reg.exe delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v %i /f 1>nul )
C:\>(reg.exe delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v Mobile /f 1>nul )
Ошибка: Не удается найти указанный раздел или параметр в реестре.
C:\>pause Для продолжения нажмите любую клавишу . . .
Получается он находит ключь правильно, но передаёт на удаление часть ключа до пробела. Поэтому не срабатывает

Ruslan-kam
08-02-2011, 23:06
УРААААААА! Сам победил.
Надо добавить команду Tokens она определяет сколько строк передавать в тело для выполнения цикла. Звёздочка автоматически присваивает строке переменную которую уже можно использовать в теле. Команду delims= пропустил потому что она и у меня и по умолчанию имеет в параметре табуляцию и пробел. Так что мне она не нужна.
set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
for /f "Tokens=1-2*" %%i in ('reg.exe query "%sKey%" ^| find /i "Megafon"') do (reg.exe delete "%sKey% " /v "%%i %%j" /f >nul)

SendMessage
09-02-2011, 05:59
УРААААААА! Сам победил. »
Все это, конечно, хорошо, но что ты будешь делать, если другой параметр будет не из двух слов, а из одного? Или из трех?
Ведь, как ты сам говоришь, не один параметр может подпадать под поиск. А один параметр и напрямую удалить можно. Iska об этом и сказал.

Ruslan-kam
09-02-2011, 06:31
SendMessage,
Вот так!
@echo off
REM удаляем ключ без пробелов в имени
set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
for /f "" %%i in ('reg.exe query "%sKey%" ^| find /i "Megafon"') do (reg.exe delete "%sKey% " /v "%%i" /f >nul)

REM удаляем ключ с двумя словами в имени
set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
for /f "Tokens=1-2*" %%i in ('reg.exe query "%sKey%" ^| find /i "Megafon"') do (reg.exe delete "%sKey% " /v "%%i %%j" /f >nul)

REM удаляем ключ с тремя словами в имени
set sKey=HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
for /f "Tokens=1-3*" %%i in ('reg.exe query "%sKey%" ^| find /i "Megafon"') do (reg.exe delete "%sKey% " /v "%%i %%j %%k" /f >nul)
REM ну и так далее скольку нужно столько и выполняем.

Всё это безобразие засовываем в один батник.

Может коряво и не профессионально, но зато работает.

Ruslan-kam
09-02-2011, 06:48
Я думаю максимум 4 раза надо будет пробежаться по ветке что бы удалить то что нужно. Вряд ли будет параметр содержащий в имени 5 и более слов.
Хотя даже если и есть, ни чего не помешает и с ним справится :yes:

SendMessage
09-02-2011, 08:37
Ruslan-kam, тогда уж в первом цикле напиши "Tokens=1". И звездочки тебе ни к чему - только лишние ошибки. Через них записывается в дополнительную переменную остаток от строки.
Т.е. если пишешь "Tokens=1-2*", то помимо двух переменных, разделенных разделителем (маслом масляным :) ), создается третья, в данном случае %%k - в ней содержится весь остаток от строки.
Пример:
строка, полученная функцией query:
Mobile Partner REG_SZ C:\Program Files\MegaFon Internet\MegaFon Internet.exe
в переменную %%i записывается "Mobile"
в переменную %%j записывается "Partner"
в переменную %%k записывается "REG_SZ C:\Program Files\MegaFon Internet\MegaFon Internet.exe"

Ruslan-kam
09-02-2011, 11:41
SendMessage, ну так то да. есть немного грязи. Вчера башка уже ватная была пока ломал мозг, как с пробелом справится. Почему то звёздочка мне в память засела что именно она образует дополнительные переменные. Сегодня на свежую голову перечитал справку по параметрам. Согласен звезда вообще ни к чему.

Да и не спец я по батникам...

Ruslan-kam
09-02-2011, 12:30
Если у вас есть альтернатива, с радостью прочту её.

palexa
29-07-2017, 18:59
Привет!

Может поможет кто

Есть ветки реестра, типа
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\{e768c1e7-986a-404d-bbf3-748b5dce914a}\##?#USBSTOR#Disk&Ven_SanDisk&Prod_Cruzer_Micro&Rev_0.1#20052845231DCFB1DD8D&0#{e768c1e7-986a-404d-bbf3-748b5dce914a}

Объеденияет их то, что в каждой из них, в названии ветки есть #USBSTOR#

Надо с помощью батника удалить все ветки в реестре, в имени которых есть #USBSTOR# без всяких вопросов

Заранее спасибо




© OSzone.net 2001-2012