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

BaerLinn 16-11-2009 15:54 1271739

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

Iska 16-11-2009 17:09 1271806

Попробуйте наподобие такого:
Код:

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

начал извращаться с подпараметрами и не успел в первонахи ;) но раз уж добил - выкладываю

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

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 1607317

Из письма в ПМ:
Цитата:

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

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

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

Ruslan-kam 08-02-2011 03:36 1607325

И так есть путь в реестре в нём ключи со строковыми параметрами если ключ имеет вид "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 1607469

Если Вам известно имя параметра раздела реестра — нет никакой нужды делать опрос и разбор, достаточно простого:
Код:

reg.exe delete "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" /v "Mobile Partner" /f

Ruslan-kam 08-02-2011 20:40 1607898

Я не знаю какое имя будет у ключей. Я знаю только часть пути куда они ведут. В этом и загвоздка.

Поэкспериментировав установил что если в устанавливаемом командой 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 1607999

УРААААААА! Сам победил.
Надо добавить команду 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 1608130

Цитата:

Цитата Ruslan-kam
УРААААААА! Сам победил. »

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

Ruslan-kam 09-02-2011 06:31 1608135

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 1608143

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

SendMessage 09-02-2011 08:37 1608180

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 1608330

SendMessage, ну так то да. есть немного грязи. Вчера башка уже ватная была пока ломал мозг, как с пробелом справится. Почему то звёздочка мне в память засела что именно она образует дополнительные переменные. Сегодня на свежую голову перечитал справку по параметрам. Согласен звезда вообще ни к чему.

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

Ruslan-kam 09-02-2011 12:30 1608365

Если у вас есть альтернатива, с радостью прочту её.

palexa 29-07-2017 18:59 2754792

Привет!

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

Есть ветки реестра, типа
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# без всяких вопросов

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


Время: 02:30.

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