Тема: 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")
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.