Что нового

[Реестр] Удаление ключей реестра, не соответствующих маске

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Здравствуйте господа.
Вопрос:
Как удалить все параметры из раздела реестра, которые не соответствуют маске. Параметров может быть много, и они не известны.
раздел HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
к примеру нужно удалить всё, за исключением: параметра со значением "C:\Program Files\Kaspersky Lab\
т.е. из автозагрузки удалить все за исключением нескольких программ.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
единственное - учесть права на изменения. ключи антивирей просто так не удалить, как и многие другие
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
как раз и антивирь не нужно удалять.
все ключи тоже не вариант удалять, так как разрядность операционных систем разная и нужные программы могут находиться либо в "C:\Program Files\ либо в "C:\Program Files(х86)\
а вписывать заведомо не рабочий ключ как то ссыкотно, порушу весь парк машин.


Добавлено:
Сообщение автоматически объединено:

ключи выбираю все, а как удалить ненужные, которые не соответствуют маске?
Код:
For $i = 1 To 100

    $var = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run", $i)
    If @error Then ExitLoop
	$RegRead = RegRead ( "HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run\", $var )

    ConsoleWrite($RegRead & @CRLF)

Next



Добавлено:
Сообщение автоматически объединено:

сделал, вроде работает
Код:
For $i = 1 To 100
   $var = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run", $i)
   If @error Then ExitLoop
   $StringLeft = StringLeft ($var,20)
   if $StringLeft <> "AVP" then RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run",$var)
   EndIf
Next
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
ZeVSalt
Интересно вы сравниваете...
Двадцать символов никогда не будут равны трём ;)
Лучше используйте StringInStr()
Код:
If Not StringInStr($var, "Kaspersky") Then RegDelete(...)
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Если так, тогда не работает.
Код:
For $i = 1 To 100
   $HLM = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run", $i)
   If Not StringInStr($HLM, "AVP") Then RegDelete("HLM\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run",$HLM)
Next



Добавлено:
Сообщение автоматически объединено:

а так работает, но почему то с одного запуска не все ключи вычищает, надо 2-3 раза запустить

Код:
For $i = 1 To 100
   $HLM = RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run", $i)
   $SLHLM = StringLeft ($HLM,20)
   if $SLHLM <> "AVP" then RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run",$HLM)
Next



Добавлено:
Сообщение автоматически объединено:

и так тоже не работает, оставляет первый параметр, а второй удаляет, как сделать что бы несколько параметров можно было не удалять?

Код:
if $SLHLM <> "AVP" Or "qwerty" then RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run",$HLM)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
ZeVSalt
тогда не работает
Естественно. У вас в пути "HLM" буква "K" пропущена.
И с двойными слешами лучше не экспериментировать.

с одного запуска не все ключи вычищает
Потому что, удалив ключ, нужно уменьшить $i на единицу. Иначе на место удалённого ключа встаёт следующий, который, естественно, пропускается.
Либо можно собрать все ключи в массив и удалять, читая из массива.


Добавлено:
Сообщение автоматически объединено:

ZeVSalt
что бы несколько параметров
Код:
if $SLHLM <> "AVP" Or $SLHLM <> "qwerty" then
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
да, спасибо, увидел где.

Код:
If Not StringInStr($HLM, 'AVP' Or 'qwerty' Or 'asdfg') Then RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run',$HLM)


так не работает, оставляет только первый параметр

И с двойными слешами лучше не экспериментировать.
почему? я думал они равнозначны
*** хотя на всякий случай переделал :smile:


Добавлено:
Сообщение автоматически объединено:

так работает корректно
Код:
if $SLHLM <> 'AVP' And $SLHLM <> 'qwerty' And $SLHLM <> 'asdfg' Then RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run',$HLM)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
ZeVSalt
так не работает
Код:
If Not (StringInStr($HLM, 'AVP') Or StringInStr($HLM, 'qwerty') Or StringInStr($HLM, 'asdfg')) Then


я думал они равнозначны
Теоритически - да. Но при работе с удалённым реестром путь начинается с двух слешей. И как, при очередном обновлении AutoIt, поведёт себя функция - неизвестно. Короче, я вас предупредил - вы приняли решение.


Добавлено:
Сообщение автоматически объединено:

Обновил условие.
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
Код:
For $a = 1 To 100

For $i = 1 To 100
   $HLM = RegEnumVal('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run', $i)
If Not StringInStr($HLM, 'AVP') Or Not StringInStr($HLM, 'qwerty') Or Not StringInStr($HLM, 'asdfg') Then RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run',$HLM)
Next
Next


так же оставляет только первый параметр.

За предупреждение спасибо, поправил везде
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
ZeVSalt
В вашем случае нужно или так
Код:
If Not (StringInStr($HLM, 'AVP') Or StringInStr($HLM, 'qwerty') Or StringInStr($HLM, 'asdfg')) Then
или так
Код:
If Not StringInStr($HLM, 'AVP') And Not StringInStr($HLM, 'qwerty') And Not StringInStr($HLM, 'asdfg') Then
 
Автор
ZeVSalt

ZeVSalt

Я не лупоглазый, это прищур такой !
Сообщения
136
Репутация
0
второй вариант работает нормально, спасибо


Добавлено:
Сообщение автоматически объединено:

может кому пригодится:
Код:
For $a = 1 To 100
   For $i = 1 To 100
	  $HLM = RegEnumVal('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run', $i)
	  $HCU = RegEnumVal("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", $i)
	  If Not StringInStr($HLM, 'AVP') And Not StringInStr($HLM, 'qwerty') And Not StringInStr($HLM, 'asdfg') Then RegDelete('HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\Windows\CurrentVersion\Run',$HLM)
	  If Not StringInStr($HCU, 'AVP') And Not StringInStr($HCU, 'qwerty') And Not StringInStr($HCU, 'asdfg') Then RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", $HCU)
   Next
Next
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
ZeVSalt
Условие можно подсократить
Код:
If Not StringRegExp($HLM, "(?i)avp|qwerty|asdfg") Then
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
ZeVSalt
Код:
If Not StringInStr('|AVP|qwerty|asdfg|', '|' & $HCU & '|') Then
 
Верх