Яндекс.Метрика

Loop (registry) -Autohotkey

Извлекает содержимое указанного раздела реестра, считывая его элементы по очереди.

Извлекает содержимое указанного раздела реестра, считывая его элементы по очереди.

Loop, RootKey [, Key, IncludeSubkeys?, Recurse?]

Параметры

RootKey Имя корневого раздела. Возможные значения: HKEY_LOCAL_MACHINE (или HKLM), HKEY_USERS (или HKU), HKEY_CURRENT_USER (или HKCU), HKEY_CLASSES_ROOT (или HKCR), HKEY_CURRENT_CONFIG (или HKCC).

Для доступа к удалённому реестру укажите вначале имя компьютера с двоеточием на конце, как в этом примере: \\workstation01:HKEY_LOCAL_MACHINE
Key Имя раздела (например, Software\SomeApplication). Если опущено или пустое, будет считано содержимое корневого раздела.
IncludeSubkeys? 0 (по умолчанию) Подразделы указанного раздела не читаются (только параметры).
1 Читаются все параметры и подразделы.
2 Читаются только подразделы (не параметры).
Recurse? 0 (по умолчанию) Рекурсия в подразделы не выполняется.
1 Рекурсия выполняется, извлекаются все параметры и подразделы внутри данных подразделов.

Примечания

Реестровый цикл полезен, когда вы хотите работать с множеством параметров или разделов, обрабатывая их по очереди. Параметры и разделы извлекаются в обратном порядке (снизу вверх), чтобы можно было использовать RegDelete внутри цикла, не нарушая его работы.

Нижеследующие переменные существуют в любом реестровом цикле. Если внутри такого цикла есть другой реестровый цикл, переменные внутреннего цикла будут иметь преимущество.


A_LoopRegName Имя текущего считанного элемента, которое может быть либо именем параметра, либо именем подраздела. Параметры, которые в редакторе реестра Windows (regedit.exe) показываются как "(По умолчанию)", читаются, если им присвоено какое-то значение, но A_LoopRegName будет для них пустой.
A_LoopRegType Тип текущего считанного элемента. Может быть одним из следующих слов: KEY (раздел), REG_SZ, REG_EXPAND_SZ, REG_MULTI_SZ, REG_DWORD, REG_QWORD, REG_BINARY, REG_LINK, REG_RESOURCE_LIST, REG_FULL_RESOURCE_DESCRIPTOR, REG_RESOURCE_REQUIREMENTS_LIST, REG_DWORD_BIG_ENDIAN (вероятно, редкость на большинстве компьютеров с Windows). Если тип неизвестен, переменная будет пустой.
A_LoopRegKey Имя корневого раздела, куда осуществляется доступ (HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_USER, HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG). При доступе к удалённому реестру имя компьютера сюда не включается.
A_LoopRegSubKey Имя текущего подраздела. Совпадает со значением параметра Key, если в параметре Recurse не было задано рекурсивное чтение подразделов. В последнем случае в переменной будет полный путь к считанному элементу, не включающий имя корневого раздела. Например: Software\SomeApplication\My SubKey
A_LoopRegTimeModified Время последнего изменения текущего подраздела или любого из его параметров. Формат: YYYYMMDDHH24MISS. Эта переменная пуста, если текущий считанный элемент не является разделом (т.е. A_LoopRegType не равна KEY) или если операционная система - Win9x (т.к. Win9x не отслеживает эту информацию).

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


RegRead, OutputVar Читает текущий элемент. Если это раздел, ErrorLevel будет установлен в 1, и OutputVar будет пустой.
RegWrite [, Value] Пишет в текущий элемент. Если значение для Value не задано, в текущий параметр реестра будет записан 0 или пустая строка, в зависимости от типа параметра. Если текущий элемент - раздел, ErrorLevel устанавливается в 1 и больше ничего не делается.
RegDelete Удаляет текущий элемент. Если это раздел, он удаляется вместе со всеми подразделами и параметрами внутри него.

Осуществляя доступ к удалённому реестру (через параметр RootKey, описанный выше), имейте в виду следующее.

  • На целевой машине должна быть запущена служба "Удалённый реестр" ("Remote Registry"). На Windows Me/98/95 её необходимо установить (получить можно у Microsoft).
  • Доступ к удалённому реестру может не удаться, если целевой компьютер не в том же домене, что и ваш, или если локальная или удалённая учётная запись не обладает достаточными разрешениями (впрочем, смотрите ниже возможные обходные пути).
  • В зависимости от домена, рабочей группы и/или разрешений вашей учётной записи вам может потребоваться подключение к сетевому устройству, такому как сетевой диск, перед тем как пытаться получить доступ к удалённому реестру. Осуществление такого подключения - с использованием имени и пароля удалённого пользователя, имеющего право на доступ к реестру или его редактирование - может, как побочный эффект, задействовать доступ к удалённому реестру.
  • Если вы уже подключены к целевому компьютеру под другим именем (например, к сетевому диску как пользователь Гость), вам, возможно, придётся прервать это соединение, чтобы позволить службе удалённого реестра переподключить и перерегистрировать вас с вашим собственным именем пользователя.
  • Для Windows Server 2003 и Windows XP Professional MSDN сообщает: "Если компьютер входит в рабочую группу и задействована политика "Force network logons using local accounts to authenticate as Guest" ("Вход в систему через сеть по локальной учётной записи разрешён только под именем Гость"), эта функция не действует. Имейте в виду, что эта политика включена по умолчанию, если компьютер входит в рабочую группу."
  • Для Windows XP Home Edition MSDN сообщает, что "эта функция никогда не действует".
  • Если кому-то точно известно, применимы ли последние два пункта выше к локальному компьютеру, к удалённому или к обоим, пожалуйста, свяжитесь с автором.

Смотрите описание команды Loop относительно блоков кода, команд Break, Continue и переменной A_Index (которая существует во всех типах циклов).

Примеры

; Пример 1. Удаление истории набранных пользователем адресов в Internet Explorer. Loop, HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\TypedURLs RegDelete ; Пример 2. Тестовый скрипт. Loop, HKEY_CURRENT_USER, Software\Microsoft\Windows, 1, 1 { if a_LoopRegType = key value = else { RegRead, value if ErrorLevel value = *Ошибка* } MsgBox, 4, , %a_LoopRegName% = %value% (%a_LoopRegType%)`n`nПродолжить? IfMsgBox, NO, break } ; Пример 3. Рекурсивный поиск по всему реестру заданного параметра/параметров. SetBatchLines -1 ; Заставляет поиск идти на максимальной скорости. RegSearchTarget = Notepad ; Сообщает подпрограмме, что нужно искать. Gosub, RegSearch return RegSearch: ContinueRegSearch = y Loop, HKEY_LOCAL_MACHINE, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; Означает остановку поиска. return } Loop, HKEY_USERS, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; Означает остановку поиска. return } Loop, HKEY_CURRENT_CONFIG, , 1, 1 { Gosub, CheckThisRegItem if ContinueRegSearch = n ; Означает остановку поиска. return } ; Замечание: я считаю, что не нужно искать в HKEY_CURRENT_USER, если проводится поиск ; в HKEY_USERS. То же может быть верно для HKEY_CLASSES_ROOT, если проводится поиск ; в HKEY_LOCAL_MACHINE. return CheckThisRegItem: if A_LoopRegType = KEY ; Удалите эти две строки, если вы хотите просматривать также имена разделов. return RegRead, RegValue if ErrorLevel return IfInString, RegValue, %RegSearchTarget% { MsgBox, 4, , ( Найдено следующее совпадение: `n%A_LoopRegKey%\%A_LoopRegSubKey%\%A_LoopRegName%`nЗначение = %RegValue%`n`nПродолжить? ) IfMsgBox, No ContinueRegSearch = n ; Указывает вызвавшему коду остановить поиск. } return
Теги страницы: