С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBScript/JScript/WSH/WMI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66

Реестр: Определение имени параметра по его значению

10.04.2012, 14:41. Показов 2462. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, ув. форумчане!
Нужна небольшая консультация, от знатоков темы.
Имеем раздел реестра HKLM\SOFTWARE\My_prog\Version\COMM\ в котором находится 17 ключей от COM1 до CH16 (т.е. COM1 на материнской плате + 16 com-портов на внешней мультипортовой плате)
Code
1
2
3
4
5
6
HKLM\SOFTWARE\My_prog\Version\COMM\
"CH10"="NO"
"CH01"="NO"
"COM1"="DEV_2"
"CH03"="DEV_7"
"CH04"="DEV_1"
На некоторых портах прописаны устройства DEV_1, DEV_2 и т.д.(до 8-ми штук.) Имена устройств, (т.е значения ключа) мне известны. Но, на разных компьютерах, эти устройства могут быть на разных портах.
Таким образом, мне необходимо парсить ветку реестра HKLM\SOFTWARE\My_prog\Version\COMM\, находить в ней устройство DEV_x (значание ключа) и получить имя ключа (т.е. фактически номер порта, на котором сидит это устройство) его запихнуть это в переменную.
К примеру, если устройство DEV_2 обнаружено на порту CH05, то "переменная_такая_то" будет 05
А дальше, я буду записывать значение этой переменной в лог, в определённую позицию.
* * *
Visual Basic
1
2
3
4
5
6
7
8
Dim WshShell, dwFlag, strValue,
Set dwFlag = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\")
strValue15 = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\CH15")
strValue5 = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\CH05")
strValue1 = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\COM1")
strValue6 = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\СH06")
 
WScript.Echo "CH15=",strValue15&vbCrLf&"CH05=",strValue1&vbCrLf&"USB=",strValue2

В приведенном выше коде, я могу получить в переменную, только значение ключа, а как проделать операцию, обратную? По значению ключа получить имя ключа?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2012, 14:41
Ответы с готовыми решениями:

Доступ к значению ИНПУТ'а по его имени
Добрый день! Необходимо следующее у меня есть инпут с name='input'. Можно ли при помощи JS взять его значение? Именно только при помощи...

Определение номера столбца по его значению
Добрый день Прошу помощи ) В книге эксель на листе "Данные" есть таблица с значениями На лист2 в столбец B выводится адрес...

Поиск свободного Com порта, определение его имени.
Собственно вопрос в теме. Помогите пожалуйста, с девайсами пока не работал... Заранее всем спасибо.

8
251 / 239 / 16
Регистрация: 31.12.2009
Сообщений: 324
10.04.2012, 15:17
обратную операцию проделать нельзя - нет однозначного соответствия, а чтобы сделать то что вам надо: построить таблицу соответствия "CHi"->"DEV_i" надо на каждом компе однократно перебрать все 17 ключей реестра, а потом просто отсортировать эту таблицу так как вам надо ("CHi"->"DEV_i" или "DEV_i"->"CHi") ну и выводить в лог
0
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
10.04.2012, 16:06  [ТС]
Если слегка упростить задачу (примем, что все устройства у нас висят только на мультипортовке), то на каком-нибудь с++ это можно реализовать путём перебора данных в массиве: цикл for
Но, как это реализовать на VBS, пока не представляю... Может кто-то поможет?


C++
1
2
3
4
5
6
7
8
9
10
11
string[] arr = new string[17];
                for (int i = 1; i < 17;i++ ){
                    arr[i] = WshShell.RegRead("HKLM\SOFTWARE\My_prog\Version\COMM\CH" + i);
                }
                int dev1_var, dev2_var;
                for (int i = 1; i < 17;i++ ){
                    if(arr[i]=='dev1')
                        dev1_var = i;
                    if(arr[i]=='dev2')
                        dev2_var = i;
                }
0
251 / 239 / 16
Регистрация: 31.12.2009
Сообщений: 324
10.04.2012, 19:26
WSH поддерживает два языка: VBscript и Jscript, далее код на Jscript:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    var i, arrA = new Array(17);
    var objShell = WScript.CreateObject("WScript.Shell");
 
    arrA[0]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\COM1") + ":COM1";
    arrA[1]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH01") + ":CH01";
    arrA[2]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH02") + ":CH02";
    arrA[3]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH03") + ":CH03";
    arrA[4]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH04") + ":CH04";
    arrA[5]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH05") + ":CH05";
    arrA[6]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH06") + ":CH06";
    arrA[7]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH07") + ":CH07";
    arrA[8]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH08") + ":CH08";
    arrA[9]  = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH09") + ":CH09";
    arrA[10] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH10") + ":CH10";
    arrA[11] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH11") + ":CH11";
    arrA[12] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH12") + ":CH12";
    arrA[13] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH13") + ":CH13";
    arrA[14] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH14") + ":CH14";
    arrA[15] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH15") + ":CH15";
    arrA[16] = objShell.RegRead("HKLM\\SOFTWARE\\My_prog\\Version\\COMM\\CH16") + ":CH16";
 
    arrA.sort();
 
    for (i = 0; i < 18; i++)
        WScript.Echo("arrA[" + i + "] = \"" + arrA[i] + "\"\n");
 
    WScript.Quit();
скопируйте его в файл с расширением ".js". Работоспособность я НЕ ПРОВЕРЯЛ!
1
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
19.04.2012, 13:31  [ТС]
Спасибо за помощь, но увы, ни чего не получилось... В JScript не силён а переделать Ваш кусок кода, на VBScript не получается...
0
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
16.12.2012, 21:16  [ТС]
Решил все-таки закрыть данную тему, т.к. решение задачи не совсем тривиальное, да и может пригодится кому-нибудь.
Во-первых, спасибо buggydancer, за то что направил на путь истинный! Хоть и с опозданием, но спасибо!
Ваше предложение с массивом, действительно работает! Единственное, что сделал - это расширил его и реализовал на VBS (ну, мне так удобнее).
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Dim WshShell, dwFlag, strValue
Const ForReading = 1
Const ForWriting = 2
TristateUseDefault = -2
Dim arrA (20)
Set objFSO = CreateObject("Scripting.FileSystemObject")
SET objShell = WScript.CreateObject("WScript.Shell")
Set tsOut = objFSO.CreateTextFile("output.txt", True, False) 
 
    arrA(0)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\COM1") + ":COM1"
    arrA(1)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH01") + ":CH01"
    arrA(2)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH02") + ":CH02"
    arrA(3)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH03") + ":CH03"
    arrA(4)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH04") + ":CH04"
    arrA(5)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH05") + ":CH05"
    arrA(6)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH06") + ":CH06"
    arrA(7)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH07") + ":CH07"
    arrA(8)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH08") + ":CH08"
    arrA(9)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH09") + ":CH09"
    arrA(10) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH10") + ":CH10"
    arrA(11) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH11") + ":CH11"
    arrA(12) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH12") + ":CH12"
    arrA(13) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH13") + ":CH13"
    arrA(14) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH14") + ":CH14"
    arrA(15) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH15") + ":CH15"
    arrA(16) = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH16") + ":CH16"
 
    
    for i = 0 to 20
           
    tsOut.WriteLine arrA(i) & vbCrLf
    Next
    tsOut.Close
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
17.12.2012, 17:01
Короче:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Const ForReading = 1
Const ForWriting = 2
Const TristateUseDefault = -2
Dim arrA (20), n
Dim objShell, dwFlag, objFSO, tsOut
 
Set objFSO = CreateObject("Scripting.FileSystemObject")
SET objShell = WScript.CreateObject("WScript.Shell")
Set tsOut = objFSO.CreateTextFile("output.txt", True, False) 
 
arrA(0)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\COM1") + ":COM1"
 
For n = 1 to 16
    arrA(n)  = objShell.RegRead("HKLM\SOFTWARE\Wincor Nixdorf\CSC-W32\CurrentVersion\CSCCOMM\CH" & IIf(n < 10, "0", "") & n) + ":CH" & IIf(n < 10, "0", "") & n
next
    
for i = 0 to 20
    tsOut.WriteLine arrA(i) & vbCrLf
Next
tsOut.Close
 
Set tsOut = nothing
SET objShell = nothing
Set objFSO = nothing
0
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
17.12.2012, 17:54  [ТС]
Интересное решение... Правда, я не совсем понял, что у вас выполняется в строке 14 через функцию "IIf". Вычисляет номер порта, до 10 и после?
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.12.2012, 12:54
Возвращает 2-й или 3-й аргумент в зависимости от истинности 1-го.

Функция IIF

Цитата Сообщение от Help
Функция IIf

IIf(Expression, TruePart, FalsePart)

Служит для возвращения одного из двух заданнных выражений в зависимости от значения логичесого выражения(условия)

Возвращаемое значение

Возвращает значение выражения TruePart или FalsePart с типом данных Variant с субтипом возвращаемого значения

Параметры

Функция содержит именованные аргументы


Элемент

Описание

Expression

Обязательный. Проверяемое выражение

TruePart

Обязательный. Значение или выражение, возвращаемое, если параметр Expression имеет значение True

FalsePart

Обязательный. Значение или выражение, возвращаемое, если параметр Expression имеет значение False

*

Примечание

Функция IIf оценивает оба выражения (TruePart и FalsePart), несмотря на то, что возвращается только одно из них. В некоторых случаях это приводит к нежелательным побочным эффектам. Например, если при вычислении выражения FalsePart имеет место деление на нуль, то возникнет ошибка, даже если значение параметра Expression равняется True

В MSDN и в Help для Visual Basic 5 первый аргумент имеет неправильное название expr вместо Expression.Поэтому при использовании именнованных аргументов IIf(expr:=...) возникнет ошибка

Пример

'*Выбираем*одно*из*двух*выражений

Visual Basic
1
2
3
4
5
6
7
8
9
Dim*mysite*As*String,*anysite*As*String,*retval*As*String
 
mysite*=*"Русский_Проект"
 
anysite*=*mysite
 
retval*=*IIf(anysite*=*mysite,*"-*отличный*сайт",*"-*так*себе")
 
Print*mysite*&*retval
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2012, 12:54
Помогаю со студенческими работами здесь

Определение факта регистрации пользователя и его имени
Здравствуйте. Подскажите, пожалуйста, как программно определить, что пользователь залогинился на сайте, а также имя этого пользователя. ...

Определение кодового имени листа и дальнейшее его использование в качестве переменной
Здравствуйте, Уважаемые! Подскажите, плиз как можно правильно определить кодовое имя листа и в дальнейшем его использовать в качестве...

Как передать значение параметра функции одного экзешника значению параметра функции другому екзешнику?
Здравствуйте! Ребята подскажите по такому вопросу. У меня есть консольное приложение в котором происходит копирование файлов из...

Запись параметра в реестр
Привет. Как мне записать параметр в реестр c помощью функции &quot;RegSetValueEx&quot;, тип которого &quot;Other&quot;? Для всех типов...

Запись двоичного параметра в реестр
Собственно не могу понять. пробовал так : users Registry; procedure TForm13.Button1Click(Sender: TObject); var reg: tregistry; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru