Форум «Всё о Паскале» _ Ада и другие языки _ Изменение реестра с помощью JS
Автор: dron4ik 11.11.2009 14:39
привет всем. Задание такое, скрипт состоит из двух параметров. 1)первый параметр должен создавать ключ, где имя ключа должно передаваться через параметр(т.е.название ключа мы сами пишем),еще ключ должен создаваться в любой ветке т.е. ветку тоже указываем через параметр. 2)второй параметр должен задавать значение ключа и удаление ключа. У мя есть пример, но он все делает автоматически без каких либо параметров т.е. ветки, значение ключей, название можно менять только в коде что неудобно для обычного пользователя. помогите пожалуйста разобраться с параметрами(.
Код
//Пример работы с реестром на JScript var WSHShell = WScript.CreateObject("WScript.Shell"); WSHShell.Popup("Создаем раздел");
Почему ты все время недоговариваешь условие? Ну, если не ввел я второй параметр, что тогда? Не удалять созданный ключ в реестре? Что значит,
Цитата
второй параметр должен задавать значение ключа и удаление ключа
? Как параметр может задавать удаление? Он может запросить у скрипта удалить ключ из реестра, но тогда о каком значении речь? Ты уж выбери, что должен делать второй параметр, задавать значение ключу, имя которого передано первым параметром, или удалять этот самый только созданный ключ (зачем тогда создавали? Как ты проверишь работоспособность программы? У тебя ж все останется как и было в реестре, можешь просто написать только
WScript.Echo("Ключ создан и удален");
, и разницы никакой не будет...)
Автор: dron4ik 11.11.2009 17:15
Прежняя моя ошибка(.Если не вводим второй параметр, то удаление ключа не происходит. Все-таки название и значение ключа задается с помощью первого параметра(. т.е параметры живут отдельно.
Добавлено через 2 мин. а второй параметр удаляет этот созданный ключ.
Автор: dron4ik 11.11.2009 18:21
Я нашел что то похожее в инете но оно написано на vbs.
Код
Dim Names Dim WshShell Set WshShell = CreateObject("WScript.Shell") 'Записать в реестр 'параметры: 'name - куда записать. Name должен начинаться с одного из корневых ключей: HKEY_CURRENT_USER - HKCU, ' HKEY_LOCAL_MACHINE - HKLM, HKEY_CLASSES_ROOT - HKCR, HKEY_USERS - HKEY_USERS, ' HKEY_CURRENT_CONFIG - HKEY_CURRENT_CONFIG. напр. "HKCU\Software\1C\1cv7\7.7\Test\script name" 'Value - значение параметра 'strType - тип параметра, возможные значения "REG_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_BINARY" Sub RegWrite(name,Value,strType) WshShell.RegWrite name,Value,strType End Sub
'Получить значение параметра 'strName - значение параметра. strName должен начинаться с одного из корневых ключей: HKEY_CURRENT_USER - HKCU, ' HKEY_LOCAL_MACHINE - HKLM, HKEY_CLASSES_ROOT - HKCR, HKEY_USERS - HKEY_USERS, ' HKEY_CURRENT_CONFIG - HKEY_CURRENT_CONFIG. напр."HKCU\Software\1C\1cv7\7.7\Test\script name" Function RegRead(strName) strName = WshShell.RegRead(strName) End Function
'Удалить раздел/параметр 'strName - значение раздела/параметра. strName должен начинаться с одного из корневых ключей: ' HKEY_CURRENT_USER - HKCU, HKEY_LOCAL_MACHINE - HKLM, HKEY_CLASSES_ROOT - HKCR, HKEY_USERS - HKEY_USERS, ' HKEY_CURRENT_CONFIG - HKEY_CURRENT_CONFIG. 'для удаления раздела StrName должен заканчиваться "\" (напр."HKCU\Software\1C\1cv7\7.7\Test\") 'для удаления параметра strName должен быть в виде "HKCU\Software\1C\1cv7\7.7\Test\script name" Sub RegDelete(strName) WshShell.RegDelete(strName) End Sub
' ----------------------------------------------------------------------------- 'Соответсвие значений корней реестра: 'HKEY_CLASSES_ROOT &H80000000 'HKEY_CURRENT_USER &H80000001 'HKEY_LOCAL_MACHINE &H80000002 'HKEY_USERS &H80000003 'HKEY_CURRENT_CONFIG &H80000005 'т.е. в нижеследующих функциях можно в параметре "rasdel" указывать (например 'если нужно обратиться к корню HKEY_CURRENT_USER) то можно указать 'или HKEY_CURRENT_USER или HKCU или &H80000001 ' -----------------------------------------------------------------------------
'возвращает в переменную Names все подразделы в указанном разделе 'в виде строки с разделителем ";" 'напр.: "AddTemplate;AutoCompleteSymb;DisableTemplate;EnumMethDlg;ParamInfo;" Function EnumSubKey(rasdel, strKeyPath, Names) If rasdel = "HKEY_CURRENT_USER" OR rasdel = "HKCU" OR rasdel = "&H80000001" Then rasdel = &H80000001 elseif rasdel = "HKEY_LOCAL_MACHINE" OR rasdel = "HKLM" OR rasdel = "&H80000002" Then rasdel = &H80000002 elseif rasdel = "HKEY_USERS" OR rasdel = "&H80000003" Then rasdel = &H80000003 elseif rasdel = "HKEY_CURRENT_CONFIG" OR rasdel = "&H80000005" Then rasdel = &H80000005 End If strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv") oReg.EnumKey rasdel, strKeyPath, arrSubKeys On Error Resume Next For Each subkey In arrSubKeys Names =Names & subkey & ";" Next End Function
'возвращает в переменную Names параметры в указанном разделе 'в виде строки с разделителем ";" 'напр.: "lang;components;" Function EnumValues(rasdel, strKeyPath, Names) If rasdel = "HKEY_CURRENT_USER" OR rasdel = "HKCU" OR rasdel = "&H80000001" Then rasdel = &H80000001 elseif rasdel = "HKEY_LOCAL_MACHINE" OR rasdel = "HKLM" OR rasdel = "&H80000002" Then rasdel = &H80000002 elseif rasdel = "HKEY_USERS" OR rasdel = "&H80000003" Then rasdel = &H80000003 elseif rasdel = "HKEY_CURRENT_CONFIG" OR rasdel = "&H80000005" Then rasdel = &H80000005 End If strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv") oReg.EnumValues rasdel, strKeyPath, arrValueNames On Error Resume Next For Each ValueNames In arrValueNames Names =Names & ValueNames & ";" Next End Function
'возвращает в переменную Names параметры ,их значения и типы в указанном разделе 'в виде строки "lang=2,REG_SZ;components=3,REG_DWORD;", т.е. 'параметру lang соответствует значение 2 тип REG_SZ, а параметру components 'соответствует значение 3 тип REG_DWORD Function EnumParamValues(rasdel, strKeyPath, Names) const REG_SZ = 1 const REG_EXPAND_SZ = 2 const REG_BINARY = 3 const REG_DWORD = 4 const REG_MULTI_SZ = 7 If rasdel = "HKEY_CURRENT_USER" OR rasdel = "HKCU" OR rasdel = "&H80000001" Then ras = &H80000001 elseif rasdel = "HKEY_LOCAL_MACHINE" OR rasdel = "HKLM" OR rasdel = "&H80000002" Then ras = &H80000002 elseif rasdel = "HKEY_USERS" OR rasdel = "&H80000003" Then ras = &H80000003 elseif rasdel = "HKEY_CURRENT_CONFIG" OR rasdel = "&H80000005" Then ras = &H80000005 End If strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" &_ strComputer & "\root\default:StdRegProv") oReg.EnumValues ras, strKeyPath, arrValueNames, arrValueTypes On Error Resume Next For i=0 To UBound(arrValueNames) Names =Names & arrValueNames(i) & "=" Select Case arrValueTypes(i) Case REG_SZ tip = "REG_SZ" Case REG_EXPAND_SZ tip = "REG_EXPAND_SZ" Case REG_BINARY tip = "REG_BINARY" Case REG_DWORD tip = "REG_DWORD" Case REG_MULTI_SZ tip = "REG_MULTI_SZ" End Select str1 = rasdel & "\" & strKeyPath & "\" & arrValueNames(i) str = RegRead(str1) Names = Names & str1 & "," & tip & ";" Next End Function---------------------------
Автор: volvo 11.11.2009 18:45
Ну, а теперь посмотри, что передается в этот VBS. Три параметра, только чтоб записать новый ключ в реестр. А ты хочешь двумя, да еще и с возможностью удаления. Приводи примеры, как ты хочешь ВЫЗЫВАТЬ свой скрипт. Например, что я должен написать, чтобы он мне в HKCU\Software создал новую папку MyProg, а в ней - ключ ID типа REG_SZ со значением "forum.pascal.net.ru/index.php?showuser=1235" ? Учти, с ОДНИМ параметром !!! Удалять не надо ничего, только создаем.
Автор: dron4ik 11.11.2009 18:56
К примеру
создаем раздел MyRegKey c ключом Мой ключ. c:\ cscript.exe 1.js HKCU\\MyRegKey\\Мой ключ,1
Автор: volvo 11.11.2009 19:19
Что означает 1, и какого типа должно быть значение? Строка? DWORD? Бинарное?
Вообще тебе придется разбивать строку, полученную через WScript.Arguments(0) при помощи Split на части:
var create_parameters = WScript.Arguments(0).Split(",");
, и уже оттуда получать все необходимые данные.
Автор: dron4ik 11.11.2009 19:21
любой тип к примеру dword. а что такое Split?
Добавлено через 4 мин. Split делит строку на кусочки)
Добавлено через 2 мин.
это в начале прописывать? var create_parameters = WScript.Arguments(0).Split(",");
Автор: volvo 11.11.2009 19:30
Split - это функция, которая разобьет строку на части, разделенные заданным символом. К примеру:
var first = WScript.Arguments(0); var create_parameters = first.split(","); for(var i = 0; i < create_parameters.length; i++) { WScript.Echo(create_parameters[i]); }
В работе со строками (чтоб вытащить название ветки и название ключа) разберешься?
Автор: dron4ik 11.11.2009 20:27
странно пробовал вашу прогу.. но у меня не создается ключ(
Автор: dron4ik 11.11.2009 21:02
Запустилась))
F:\Programs>cscript test_js.js "HKCU\MyRegKey\My Key",1--странно при этом создается два ключа первый имеет имя string со значением 1. второй не имеет имя(по умолчанию) со значением My key.
Автор: volvo 11.11.2009 21:13
Это не 2 ключа, это раздел (то, что "по умолчанию" - это корень созданного раздела, обычно его делают REG_SZ и без значения) и ключ.
Автор: dron4ik 11.11.2009 21:13
Конец строки всегда явся значением ключа без имени.
Добавлено через 4 мин. а как реализовать чтоб имя ключа задавал пользователь в параметре его создания?
Автор: dron4ik 11.11.2009 22:01
А что означают строки каждая в отдельности?
var last_bs = create_parameters[0].lastIndexOf("\\") + 1; var branch_name = create_parameters[0].substr(0, last_bs); var key_name = create_parameters[0].substr(last_bs, create_parameters[0].length - last_bs);