Что нового

[Реестр] Найти и удалить значение в реестре по маске

berkut9737

Новичок
Сообщения
22
Репутация
0
Нужно найти и удалить значение в реестра по маске.
Известен ключ реестра HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID
Известно окончание значения параметра [xxxxxxxxxxx]=
Известно, что значение с таким "хвостиком" одно в этом разделе
Пожалуйста, помогите написать скрипт!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: [Реестр] Найти и удалить ключь реестра по маске

CLSID - это уникальный идентификатор, и я не рекомендую удалять их только по "хвостику". Если вам известно окончание CLSID, то должна быть известна и вся строка.

В любом случае, вот простой код:

Код:
Global Const $Str = '00A0C9062410}'

$Count = 1
While 1
	$Key = RegEnumKey('HKLM\SOFTWARE\Classes\CLSID', $Count)
	If @error Then
		ExitLoop
	EndIf
	If StringInStr($Key, $Str, 0, -1) Then
		ConsoleWrite('HKLM\SOFTWARE\Classes\CLSID\' & $Key & @CR)
;		RegDelete('HKLM\SOFTWARE\Classes\CLSID\' & $Key)
		ExitLoop
	EndIf
	$Count += 1
WEnd
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Cпасибо, буду разбираться что к чему в этом скрипте. У меня пока получается работать с программой по русской справке и раздел макросы, переменные и т.д.-это пока для меня ещё тёмный лес. Но у меня к вам сразу вопрос: что это за цифры '00A0C9062410}'?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: [Реестр] Найти и удалить ключь реестра по маске

berkut9737 сказал(а):
...что это за цифры '00A0C9062410}'?
:blink:

Это окончание вашего CLSID. Ведь именно это вы хотели?
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Простите, если я не правильно донёс до вас свою мысль. В поле поиска я хотел указать только "="
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: [Реестр] Найти и удалить ключь реестра по маске

berkut9737 сказал(а):
Простите, если я не правильно донёс до вас свою мысль. В поле поиска я хотел указать только "="
Вы еще больше меня запутали. Все подразделы в CLSID имеют следующую форму записи:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} (8-4-4-4-12)

У вас по другому? О каком тогда "хвостике" идет речь? Напишите полностью имя раздела, который нужно удалить.
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Вот ключ = HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} название параметра = "xxxxxxxxxxxxxxxxxxxx", значение ="xxxxxxxxxxxxxxxxx=="
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Код:
1.Global Const $Str = '00A0C9062410}'
Global = принудительно глобальная переменная.
Const= Математическая константа — величина, значение которой не меняется; в этом она противоположна переменной. В отличие от физических констант, математические константы определены независимо от каких бы то ни было физических измерений.
$Str=  '00A0C9062410}' Строка для поиска.

2.$Count = 1 Не понятно, что обозначает. В переводе с англ.-счётчик, но что подсчитывает?
В справке и гугле такую информацию не нашёл. 
3.While 1 = Цикл, основанный на значении выражения.( Тоже, пока под вопросом.)

4.$Key = RegEnumKey('HKLM\SOFTWARE\Classes\CLSID', $Count)
RegEnumKey ( "keyname", instance )= Вернуть название ключа, соответствующее его экземпляру (из справки).

5.If @error Then
If...Then = Условное выполнение одиночного выражения.(из справки)
@error= Значение флага ошибки.(из справки)
6.ExitLoop = Завершить выполнение цикла While/Do/For.(из справки)
7.EndIf = Условное выполнение выражения.
If <expression> Then
    statements
    ...
[ElseIf expression-n Then
    [elseif statements ... ]]
    ...
[Else
    [else statements]
    ...
EndIf (из справки)

8.If StringInStr($Key, $Str, 0, -1) Then
If...Then = Условное выполнение одиночного выражения.(из справки)
StringInStr($Key, $Str, 0, -1) = Проверка вхождения подстроки в указанную строку
StringInStr ( "string", "substring" [, casesense [, occurrence]] )
string = Исходная строка. 
substring = Подстрока для поиска. 
casesense = (опциональный) Режим учета регистра написания.
0 = не зависит от регистра написания согласно языку пользователя (по умолчанию)
1 = зависит от регистра написания 
2 = не зависит от регистра написания согласно базовому/наиболее быстрому сравнению 
[occurance[ = Номер искомого вхождения подстроки. Отрицательные значения означает поиск справа. Стандартное значение равно 1 - поиск только первого вхождения. 
(из справки).
9.ConsoleWrite('HKLM\SOFTWARE\Classes\CLSID\' & $Key & @CR)
ConsoleWrite = Выдать данные в поток, для чтения его, например, некоторыми редакторами.
ConsoleWrite ( "data" )
data = Данные, которые требуется выдать в поток.
@CR = Возврат каретки Chr(13); требуется для завершения строк.
& Объединение/конкатенация строк. "one" & 10 - ("one10")  

10. ExitLoop =  Завершить выполнение цикла While/Do/For.(из справки)

11. EndIf =  Условное выполнение выражения.
If <expression> Then
    statements
    ...
[ElseIf expression-n Then
    [elseif statements ... ]]
    ...
[Else
    [else statements]
    ...
EndIf (из справки)

12. $Count += 1
13.WEnd = Цикл, основанный на значении выражения. 
While <expression>
    statements
    ...
WEnd 
<expression> = Если выражение верно, то будут выполняться все последующие команды, вплоть до WEnd.  Такое циклическое выполнение будет продолжено до тех пор, пока выражение перестанет быть верным.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: [Реестр] Найти и удалить ключь реестра по маске

Помести пожалуйста весь код в тэги [autoit][/autoit].
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Yashied, ничего не получается, нужна ваша помощь! :wacko:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Re: [Реестр] Найти и удалить ключь реестра по маске

Скажи, а что это такое написано в твоем предыдущем ответе? Инструкция какая-то? Да и вообще я ничего не понял, что тебе нужно. Разберись для начала, что такое ключ (по-русски раздел) и параметр реестра. Затем скажи, что именно нужно удалить: раздел или параметр. А лучше дай скриншот. OK.
 
Автор
B

berkut9737

Новичок
Сообщения
22
Репутация
0
Re: [Реестр] Найти и удалить ключь реестра по маске

Yashied
Скажи, а что это такое написано в твоем предыдущем ответе? Инструкция какая-то?
Это не инструкция(если пожелаете, я могу удалить эту "инструкцию"). Я пытался понять логику вашего скрипта и надеялся на подсказку со стороны участников форума (повторюсь: я самоучка!). Русская справка, к сожалению, не даёт ответа на все возникающие вопросы, а книги на английском приводят в уныние, а их машинный перевод в ещё большее. Хотя программа мне очень нравится, но изучать мне её придётся, как это происходит всегда, в кривь- в кось из-за перечисленных выше препятствий. Языковой барьер на сегодняшний, вчерашний и будущий день остаётся значимым.

Да и вообще я ничего не понял, что тебе нужно. Разберись для начала, что такое ключ (по-русски раздел) и параметр реестра. Затем скажи, что именно нужно удалить: раздел или параметр. А лучше дай скриншот. OK.
Хорошо, ещё раз. Нужно найти по маске и удалить значение параметра из ключа HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID. Маска должна иметь вид "==", чуть выше, я уже приводил ключ с названием параметра и его значением. Спасибо за воспитание.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
berkut9737
проверь это, надеюсь правильно понял твой запрос...

Код:
; опции
$search='=='

$kol=StringLen($search)
$found=''

; запускаем цикл поиска всех подразделов указанного раздела реестра
$i=0
While 1
	$i+=1
    $key = RegEnumKey("HKLM\SOFTWARE\Classes\CLSID", $i)
    If @error then ExitLoop
		; запускаем вложенный цикл поиска всех параметров найденного раздела реестра
		$j=0
		While 1
			$j+=1
			$Valuename = RegEnumVal('HKLM\SOFTWARE\Classes\CLSID\'&$key, $j)
			If @error then ExitLoop
			$Value = RegRead('HKLM\SOFTWARE\Classes\CLSID\'&$key, $Valuename)
			If StringRight($Value, $kol)=$search Then
				;здесь описываем, что будем делать с тем что нашли (удалять или составить список и показать)
				$found&='HKLM\SOFTWARE\Classes\CLSID\'&$key&@TAB&$Valuename&@CRLF ;объединяем в список для просмотра
				; RegDelete('HKLM\SOFTWARE\Classes\CLSID\'&$key, $Valuename) ; тут удаляем сразу, но не рекомендуется без просмотра
			EndIf
		WEnd
WEnd

If $found = '' Then
	MsgBox(0, 'Сообщение', 'Ничего не найдено')
	Exit
EndIf

$found=StringTrimRight($found, 2) ;удаляем последний @CRLF состоящий из двух символов

; показываем найденное в виде таблицы
$list=StringSplit($found, @CRLF, 1)
Dim $Key_Val[$list[0]+1][2]
For $i = 1 to $list[0]
	$tmp=StringSplit($list[$i], @TAB)
	If $tmp[0] = 2 Then
		$Key_Val[$i][0]=$tmp[1]
		$Key_Val[$i][1]=$tmp[2]
	EndIf
Next
#include <Array.au3>
_ArrayDisplay($Key_Val, 'Найденное')

; предлагаем удалить найденные параметры
If MsgBox(4+256, 'Сообщение', 'Удалить список найденных параметров?')=6 Then
	For $i = 1 to $list[0]
		RegDelete($Key_Val[$i][0], $Key_Val[$i][1])
	Next
EndIf
 
Верх