Я - сторонник в таких случаях делать обёртки на будущее
В отдельном файле - расширяемая библиотека на тему:
// Конструктор объекта метода COM-объекта WMI.
function WMIMethod(wmiObject, methodName) {
// Атрибуты объекта.
// Экземпляр метода.
var _method;
// Экземпляр коллекции входных параметров.
var _inputParameters;
// Экземпляр коллекции выходных параметров.
var _outputParameters;
// Методы объекта.
// Коллекция выходных параметров.
this.getOutputParameters = function() {
return _outputParameters;
}
// Коллекция входных параметров.
this.getInputParameters = function() {
return _inputParameters;
}
// Установка значений входных параметров.
this.setInputParameters = function(parameters) {
for(key in parameters) {
eval("_inputParameters." + key + " = parameters[key]");
}
}
// Исполнение.
this.execute = function() {
_outputParameters = wmiObject.ExecMethod_(_method.Name, _inputParameters);
}
// Инициализация.
_method = wmiObject.Methods_.Item(methodName);
_inputParameters = _method.InParameters.SpawnInstance_();
_outputParameters = null;
}
// Конструктор объекта для работы с реестром.
// Константы.
// Корень локальной машины.
Registry.prototype.HKLM = 0x80000002;
// Типы значений.
Registry.prototype.REG_SZ = 1;
Registry.prototype.REG_EXPAND_SZ = 2;
Registry.prototype.REG_BINARY = 3;
Registry.prototype.REG_DWORD = 4;
Registry.prototype.REG_MULTI_SZ = 7;
function Registry() {
// Атрибуты объекта.
// COM-объект - WMI провайдер реестра.
var _registryProvider = null;
// Методы объекта.
// Возвращает непосредственные ключи указанной ветви дерева.
this.getSubKeys = function(rootKey, keyPath) {
var keys = new Array();
var enumKeys = new WMIMethod(_registryProvider, "EnumKey");
enumKeys.setInputParameters({ hDefKey: rootKey, sSubKeyName: keyPath });
enumKeys.execute();
with(enumKeys.getOutputParameters()) {
if(sNames != null) {
keys = sNames.toArray();
}
}
return keys;
}
// Возвращает значения ключа указанной ветви дерева.
this.getValues = function(rootKey, keyPath, valueName) {
var result = new Array();
var valuesNames, valuesTypes;
var enumValues = new WMIMethod(_registryProvider, "EnumValues");
enumValues.setInputParameters({ hDefKey: rootKey, sSubKeyName: keyPath });
enumValues.execute();
with(enumValues.getOutputParameters()) {
if(sNames != null && Types != null) {
valuesNames = sNames.toArray();
valuesTypes = Types.toArray();
for(var i = 0; i < valuesNames.length; ++i) {
result.push({ name: valuesNames[i], type: valuesTypes[i] });
}
}
}
return result;
}
// Возвращает значение из ключа.
this.read = function(rootKey, keyPath, valueName) {
var values = this.getValues(rootKey, keyPath);
var valueType = null;
for(i in values) {
if(values[i].name == valueName) {
valueType = values[i].type;
break;
}
}
var getMethodName = "";
switch(valueType) {
case Registry.prototype.REG_SZ:
getMethodName = "GetStringValue";
break;
case Registry.prototype.REG_EXPAND_SZ:
getMethodName = "GetExpandedStringValue";
break;
case Registry.prototype.REG_BINARY:
getMethodName = "GetBinaryValue";
break;
case Registry.prototype.REG_DWORD:
getMethodName = "GetDWORDValue";
break;
case Registry.prototype.REG_MULTI_SZ:
getMethodName = "GetMultiStringValue";
break;
}
var get = new WMIMethod(_registryProvider, getMethodName);
get.setInputParameters({ hDefKey: rootKey, sSubKeyName: keyPath, sValueName: valueName });
get.execute();
with(get.getOutputParameters()) {
switch(valueType) {
case Registry.prototype.REG_SZ:
case Registry.prototype.REG_EXPAND_SZ:
return sValue;
case Registry.prototype.REG_BINARY:
return uValue.toArray();
case Registry.prototype.REG_DWORD:
return uValue;
case Registry.prototype.REG_MULTI_SZ:
return sValue.toArray();
}
}
}
// Вспомогательные функции.
function _createRegistryProvider() {
var locator = new ActiveXObject("WbemScripting.SWbemLocator");
var connection = locator.ConnectServer(null, "root\\default");
return connection.Get("StdRegProv");
}
// Инициализация
_registryProvider = _createRegistryProvider();
}
В другом файле - использование для решения конкретной задачи.
<job id="RegistryTest">
<script language="JScript" src="registry.js"/>
<script language="JScript">
var registry = new Registry();
WScript.Echo(registry.read(Registry.prototype.HKLM, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "CommonFilesDir"));
WScript.Echo();
var subKeys = registry.getSubKeys(Registry.prototype.HKLM, "SOFTWARE\\Microsoft");
for(i in subKeys) {
WScript.Echo(subKeys[i]);
}
</script>
</job>
Соответственно, написанное
baldr начинает выглядеть примерно как (не отлаживал):
<job id="RegistryTest">
<script language="JScript" src="registry.js"/>
<script language="JScript">
var registry = new Registry();
var rootPath = "SOFTWARE\\Oracle";
var subKeys = registry.getSubKeys(Registry.prototype.HKLM, rootPath);
for(var i in subKeys) {
var subKey = rootPath + "\\" + subKeys[i];
var values = registry.getValues(Registry.prototype.HKLM, subKey);
for(var j in values) {
var searchName = "ORACLE_HOME";
if(values[j].name == searchName) {
WScript.Echo(registry.read(Registry.prototype.HKLM, subKey, searchName));
WScript.Quit();
}
}
}
</script>
</job>
P.S. В коде нет проверок на ошибки - желающие добавят сами.