Помощь - Поиск - Пользователи - Календарь
Полная версия: Изменение реестра с помощью JS
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
dron4ik
привет всем. Задание такое, скрипт состоит из двух параметров.
1)первый параметр должен создавать ключ, где имя ключа должно передаваться через параметр(т.е.название ключа мы сами пишем),еще ключ должен создаваться в любой ветке т.е. ветку тоже указываем через параметр.
2)второй параметр должен задавать значение ключа и удаление ключа.
У мя есть пример, но он все делает автоматически без каких либо параметров т.е. ветки, значение ключей, название можно менять только в коде что неудобно для обычного пользователя.
помогите пожалуйста разобраться с параметрами(.

Код
//Пример работы с реестром на JScript
var WSHShell = WScript.CreateObject("WScript.Shell");
WSHShell.Popup("Создаем раздел");

WSHShell.RegWrite("HKCU\\MyRegKey\\", "Primer");
WSHShell.Popup("Создаем строковый параметр");
WSHShell.RegWrite("HKCU\\MyRegKey\\String", 1);
WSHShell.Popup("Создаем параметр DWORD");
WSHShell.RegWrite("HKCU\\MyRegKey\\DWORD", 2, "REG_DWORD");
WSHShell.Popup("Создаем двоичный параметр");
WSHShell.RegWrite("HKCU\\MyRegKey\\Binary", 3, "REG_BINARY");
WSHShell.Popup("Удаляем все параметры");
WSHShell.RegDelete("HKCU\\MyRegKey\\String");
WSHShell.RegDelete("HKCU\\MyRegKey\\DWORD");
WSHShell.RegDelete("HKCU\\MyRegKey\\Binary");
WSHShell.Popup("Удаляем раздел");
WSHShell.RegDelete("HKCU\\MyRegKey\\");
volvo
Почему ты все время недоговариваешь условие? Ну, если не ввел я второй параметр, что тогда? Не удалять созданный ключ в реестре? Что значит,
Цитата
второй параметр должен задавать значение ключа и удаление ключа
? Как параметр может задавать удаление? Он может запросить у скрипта удалить ключ из реестра, но тогда о каком значении речь? Ты уж выбери, что должен делать второй параметр, задавать значение ключу, имя которого передано первым параметром, или удалять этот самый только созданный ключ (зачем тогда создавали? Как ты проверишь работоспособность программы? У тебя ж все останется как и было в реестре, можешь просто написать только
WScript.Echo("Ключ создан и удален");
, и разницы никакой не будет...)
dron4ik
Прежняя моя ошибка(.Если не вводим второй параметр, то удаление ключа не происходит. Все-таки название и значение ключа задается с помощью первого параметра(. т.е параметры живут отдельно.

Добавлено через 2 мин.
а второй параметр удаляет этот созданный ключ.
dron4ik
Я нашел что то похожее в инете но оно написано на 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
Ну, а теперь посмотри, что передается в этот VBS. Три параметра, только чтоб записать новый ключ в реестр. А ты хочешь двумя, да еще и с возможностью удаления. Приводи примеры, как ты хочешь ВЫЗЫВАТЬ свой скрипт. Например, что я должен написать, чтобы он мне в HKCU\Software создал новую папку MyProg, а в ней - ключ ID типа REG_SZ со значением "forum.pascal.net.ru/index.php?showuser=1235" ? Учти, с ОДНИМ параметром !!! Удалять не надо ничего, только создаем.
dron4ik
К примеру

создаем раздел MyRegKey c ключом Мой ключ.
c:\ cscript.exe 1.js HKCU\\MyRegKey\\Мой ключ,1

volvo
Что означает 1, и какого типа должно быть значение? Строка? DWORD? Бинарное?

Вообще тебе придется разбивать строку, полученную через WScript.Arguments(0) при помощи Split на части:
var create_parameters = WScript.Arguments(0).Split(",");
, и уже оттуда получать все необходимые данные.
dron4ik
любой тип к примеру dword.
а что такое Split?


Добавлено через 4 мин.
Split делит строку на кусочки)

Добавлено через 2 мин.

это в начале прописывать?
var create_parameters = WScript.Arguments(0).Split(",");
volvo
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]);
}
при вызове:
F:\Programs>cscript test_js.js "HKCU\\MyRegKey\\My Key",1,"322" 2

, выдаст разобранную строку:
Microsoft ® Windows Script Host Version 5.7
Copyright © Microsoft Corporation. All rights reserved.

HKCU\\MyRegKey\\My Key
1
322

dron4ik
F:\Programs>cscript test_js.js "HKCU\\MyRegKey\\My Key",1,"322" 2-- а зачем нам нужны 322 и 2 ?

Добавлено через 1 мин.
хотя не суть важно всеравно разделение на куски зависит от длины.

Добавлено через 15 мин.
вот сделал но работает не правильно..

//Пример работы с реестром на JScript
var WSHShell = WScript.CreateObject("WScript.Shell");

var first = WScript.Arguments(0);


WSHShell.Popup("Создаем раздел");
WSHShell.RegWrite("HKCU\\MyRegKey\\", "Primer");
WSHShell.Popup("Создаем строковый параметр");

var WSHShell = WSHShell.RegWrite(first + "\\String",1)




WSHShell.Popup("Удаляем все параметры");
WSHShell.RegDelete("HKCU\\MyRegKey\\String");

WSHShell.Popup("Удаляем раздел");
WSHShell.RegDelete("HKCU\\MyRegKey\\");
volvo
Ну, вот так у меня отработало:
//Пример работы с реестром на JScript
var WSHShell = WScript.CreateObject("WScript.Shell");

var first = WScript.Arguments(0);
var create_parameters = first.split(",");

WSHShell.Popup("Создаем раздел");
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);

WSHShell.RegWrite(branch_name, key_name);

WSHShell.Popup("Создаем строковый параметр");

WSHShell.RegWrite(branch_name + "String", create_parameters[1]);

if(WScript.Arguments.Count() > 1 && WScript.Arguments(1) == "/delete")
{
WSHShell.Popup("Удаляем все параметры");
WSHShell.RegDelete(branch_name + "String");

WSHShell.Popup("Удаляем раздел");
WSHShell.RegDelete(branch_name);
}

Запускал так:
F:\Programs>cscript test_js.js "HKCU\MyRegKey\My Key",1

- создается ветка + ключ и не удаляются...

Запустил так:
F:\Programs>cscript test_js.js "HKCU\MyRegKey\My Key",1 /delete

- ветка и ключ после создания удаляются...

В работе со строками (чтоб вытащить название ветки и название ключа) разберешься?
dron4ik
странно пробовал вашу прогу.. но у меня не создается ключ(
dron4ik
Запустилась))

F:\Programs>cscript test_js.js "HKCU\MyRegKey\My Key",1--странно при этом создается два ключа
первый имеет имя string со значением 1.
второй не имеет имя(по умолчанию) со значением My key.
volvo
Это не 2 ключа, это раздел (то, что "по умолчанию" - это корень созданного раздела, обычно его делают REG_SZ и без значения) и ключ.
dron4ik
Конец строки всегда явся значением ключа без имени.

Добавлено через 4 мин.
а как реализовать чтоб имя ключа задавал пользователь в параметре его создания?
dron4ik
А что означают строки каждая в отдельности?
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);
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.