1

Тема: WSH: автом. позиционирование в окне Regedit.exe на нужном параметре

Небольшой JS-скрипт демонстрирует поиск заданного раздела и параметра реестра непосредственно в окне программы Regedit.exe с помощью программной симуляции нажатия клавиш. Требует библиотеку AutoItX3.dll.
Автор скрипта - Poltergeyst.
P.S. См. также утилиту RegJump v1.01 от Марка Руссиновича.

//-----------------------------------------------------------------
// Скрипт осуществляет переход к заданному    -------------------
// параметру реестра в окне программы RegEdit,    -------------------
// с помощью программной симуляции нажатия     -------------------
// клавиш.                    -------------------
//-----------------------------------------------------------------
// Данный проект демонстрирует возможности грубой автоматизации----
// AutoItX3 OLE Server
//-----------------------------------------------------------------
// Language:        JavaScript;AutoItX3 COM v3.2.0.1
//-----------------------------------------------------------------
    try
    {
        var autoX=new ActiveXObject("AutoItX3.Control")
    }
    
    catch(twUnableAutoIt)
    {
        WScript.Echo(    "Невозможно создание объекта AutoItX3.Control.\n"    +
                "Установите библиотеку AutoItX3.dll\n"            +
                "[http://www.autoitscript.com]\n"            +
                "и зарегистрируйте её в реестре.")
        WScript.Quit()
    }
//-----------------------------------------------------------------
    var regTitle    ="Редактор реестра"
    var arr        = new Array()
    var keyMessage
//-----------------------------------------------------------------
//Переход к заданному разделу реестра
//-----------------------------------------------------------------
function initNavigateRegistry(path)
{
    try
    {
        //Выделение раздела и параметра реестра из командной строки
        var key=path.match("(KEY:).*(;PARAM)")
            key=key[0].replace("KEY:","")
                key=key.replace(";PARAM","")
                keyMessage=key

        var param=path.match("(PARAM:).*")
            param=param[0].replace("PARAM:","")
        
        destiny=key.split("\\");
        

        //Переоткрыть Regedit.exe
        if (autoX.WinExists(regTitle,""))
        {
            autoX.WinKill(regTitle,"");
        }
        
        regPID=autoX.Run("regedit.exe","",autoX.SW_MAXIMIZE)
        autoX.sleep(500)
            autoX.WinActivate(regTitle,"")
        autoX.sleep(100)
                autoX.WinSetState(regTitle,"",autoX.SW_MAXIMIZE)
                    autoX.ControlFocus(regTitle,"","SysTreeView321")
                        autoX.ClipPut("")
                            autoX.Send("{HOME}")                
                                autoX.sleep(100)
                            
            autoX.ToolTip("\nПоиск раздела реестра...\r"+
    "Чтобы остановить переместите указатель мыши в левую область экрана...\n",10,10);
                navigateRegistry(destiny,0)
            autoX.ToolTip("\nПоиск заданного параметра...\r"+
    "Чтобы остановить переместите указатель мыши в левую область экрана...\n",10,10);
                navigateParam(param);
        
    }
    catch(twException)    //Обработчик исключительных ситуаций
    {
        autoX.WinKill(regTitle,"")
            WScript.Echo("Произошла неопределенная ошибка.Возможно аргумент указан некорректно.")
                WScript.Quit()
    }
return 0
}


//-----------------------------------------------------------------
//Переход к заданному разделу реестра
//-----------------------------------------------------------------
function navigateRegistry(arr,j)
{
if (j==arr.length){return 1;}

autoX.ControlFocus(regTitle,"","SysTreeView321")

    while (1)
        {
        if (autoX.MouseGetPosX()<100)
            {
                WScript.Echo("Поиск в реестре остановлен.");
                    WScript.Quit();
            }
        autoX.Send("{DOWN}")
            autoX.WinMenuSelectItem(regTitle,"","&Правка","&Копировать имя раздела")

            //Заполнение задержки выборки данных из буфера
            autoX.ControlFocus(regTitle,"","SysTreeView321")
                autoX.ControlFocus(regTitle,"","SysTreeView321")

                regText=""
                    while (!regText){regText=autoX.ClipGet()}

                regText=regText+"\\"
                    target=regText.split("\\")
            
            //Сравнение наименований конечных хвостов заданного и текущего разделов
            if (target[j]==arr[j])
            { 
                autoX.send("{NumPadAdd}")
                    navigateRegistry(arr,j+1)    
                        return             
            }
            //Перескок в следующий раздел означает отсутствие искомого подраздела в текущем разделе
            if ((j>0)&&(target[j-1]!=arr[j-1]))
            { 
                WScript.Echo("Раздел ["+keyMessage+"] не найден.");
                    WScript.Quit()
            }
        }
return 
}

//-----------------------------------------------------------------
//Переход к заданному параметру
//-----------------------------------------------------------------
function navigateParam(param)
{
        autoX.sleep(300)
    autoX.Send("{TAB}")
        autoX.sleep(100)
    autoX.ControlFocus(regTitle,"","SysListView321")
    autoX.Send("{HOME}")
        autoX.sleep(100)
    autoX.Send("{UP}")
        autoX.sleep(100)

            //Обработка параметра "По умолчанию"
            if (param=="@")
            {paramVal=autoX.ControlListView(regTitle,"","SysListView321","Select",0,0);return}

        while (1)
        {
            if (autoX.MouseGetPosX()<100)
            {
                WScript.Echo("Поиск в реестре остановлен.");
                    WScript.Quit();
            }
        
            autoX.ControlFocus    (regTitle,"","SysListView321")

        //Команды для элемента SysListView321
        index=    autoX.ControlListView    (regTitle,"","SysListView321","FindItem",param,0)
            if (index==-1)
                {
                    WScript.Echo("Параметр ["+param+"] не существует.")
                        return 
                }
            else
                {
                    paramVal=autoX.ControlListView(regTitle,"","SysListView321","Select",index,0)
                        return
                }
        }
    return 
}
//-----------------------------------------------------------------


//Навигация в реестре
//В качестве аргумента функции initNavigateRegistry надо указать строку формата:
//"KEY:HKEY_LOCAL_MACHINE\\<подраздел1>\\<подраздел2>\\...\\<подраздел3>;PARAM:<имя параметра>"


initNavigateRegistry("KEY:HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\VxD\\VCACHE\\Lookup;PARAM:Нет такого параметра")
    autoX.sleep(300)
initNavigateRegistry("KEY:HKEY_CURRENT_CONFIG\\System\\CurrentControlSet\\Control\\Print\\Printers;PARAM:@")
    autoX.sleep(300)
initNavigateRegistry("KEY:HKEY_LOCAL_MACHINE\\Software\\ODBC\\ODBCINST.INI\\MS Code Page Translator;PARAM:UsageCount")
    autoX.sleep(300)
initNavigateRegistry("KEY:HKEY_USERS\\.DEFAULT\\SOFTWARE\\WinRAR\\SFX\\Default;PARAM:PathType")
Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: WSH: автом. позиционирование в окне Regedit.exe на нужном параметре

См. также бесплатную утилиту Registry Jumper 2.0.
Работает в трёх режимах: режим GUI (вводим ключ, на который надо прыгнуть в regedit, в специальном окошке), режим командной строки (передаём ключ реестра как параметр командной строки) и режим протокола regjump:// (подобные ссылки будут работать на HTML-страницах и в меню "Пуск" - "Выполнить").
Поддерживаются полные и короткие названия корневых ключей реестра, история недавно открытых ключей, избранное.
Ссылку прислал alexii.

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

3

Re: WSH: автом. позиционирование в окне Regedit.exe на нужном параметре

Если вспомнить, что regedit открывается всегда на том же ключе, на котором мы его спозиционировали в предыдущем сеансе работы, и найти ключик, в котором он сохраняет это местоположение, то задачу открытия regedit на любом заданном ключе можно очень сильно упростить.
Вся процедура открытия будет сводится к 2 этапам:
1. Загоняем в ключ HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey значение ветки, которую нам необходимо открыть.
2. Запускаем regedit.
Работает это исключительно быстро. Пример:

key = "HKEY_CURRENT_USER\Software\Microsoft"
Set WshShell = CreateObject("WScript.Shell")
WshShell.RegWrite "HKCU\Software\Microsoft\Windows\CurrentVersion\Applets\Regedit\Lastkey", key, "REG_SZ"
WshShell.Run "regedit", 1, False

Информацию прислал mozers.

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