Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Loop (registry)", в содержании - "Registry Management" - "Loop (registry)", v1.0.46.09.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

Loop (registry)

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

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, описанный выше), имейте в виду следующее.

Смотрите описание команды 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

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.