Поиск в реестре ключа - JScript - PullRequest
2 голосов
/ 13 мая 2010

Есть ли способ поиска в реестре определенного ключа с помощью Windows Scripting Host?

Я использую JavaScript (Jscript / VBScript?) Для этого, и библиотека msdn не упоминает ни одного такого метода: http://msdn.microsoft.com/en-us/library/2x3w20xf(v=VS.85).aspx

Спасибо


Итак, вот обновление проблемы:

Проблема немного сложнее, чем прямой поиск в реестре. Я должен просмотреть установленные продукты в окне Windows, чтобы найти конкретную запись продукта, который я хочу удалить. Путь к реестру определяется как:

HKEY_LOCAL_MACHINE \ Software \ Microsoft ... \ Products.

В ключе «Продукты» перечислены установленные продукты, но их ключи определены как хэш-коды. В ключах продукта есть другие ключи с определенными именами и определенными значениями. Я хочу иметь возможность искать последние ключи и значения. Как я могу это сделать, минуя неизвестные хэш-коды?

Например, мне нужно найти продукт с ключом DisplayVersion = 1.0.0. Путь к этому ключу:

HKLM \ Software \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData \ Продукты \ A949EBE4EED5FD113A0CB40EED7D0258 \ InstallProperties \ DisplayVersion.

Как мне получить или не писать ключ продукта: A949EBE4EED5FD113A0CB40EED7D0258 ??

Ответы [ 2 ]

7 голосов
/ 13 мая 2010

Предполагая, что вы используете JScript через Windows Scripting Host (а не JavaScript из браузера), вы можете получить значение определенного ключа, используя метод WScript.RegRead:

// MyScript.js
var key = 'HKEY_CURRENT_USER\\SessionInformation\\ProgramCount'
  , wsh = WScript.CreateObject('WScript.Shell')
  , val = wsh.RegRead(key);
WScript.Echo('You are currently running ' + val + ' programs.');

Если вам действительно нужно искать ключ или значение на основе некоторых условий, а не известного ключа реестра, тогда вы можете реализовать свой собственный алгоритм рекурсивного поиска, где значения реестра типа "REG_SZ" являются конечными узлами.

В качестве упражнения для знакомства с JScript на Windows Scripting Host я создал небольшой интерфейс с реестром , который делает именно это. Пример, включенный в проект, показывает, как выполнить такой поиск в реестре в сценарии WSF:

<job id="FindDisplayVersions">
  <script language="jscript" src="../registry.js"/>
  <script language="jscript">
    // Search the registry and gather 20 DisplayVersion values.
    var reg = new Registry()
      , rootKey = 'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Installer\\UserData\\S-1-5-18\\Products'
      , keyRegex = /Products\\(.*?)\\InstallProperties\\DisplayVersion$/
      , valRegex = /^1\./
      , maxResults = 20
      , uids = [];
    reg.find(rootKey, function(path, value) {
      var keyMatch = keyRegex.exec(path);
      if (keyMatch) {
        if (valRegex.exec(value)) {
          uids.push(keyMatch[1] + '\t=\t' + value);
          if (uids.length >= maxResults) { return false; } // Stop searching
        }
      }
      return true; // Keep searching.
    });
    WScript.Echo(uids.join("\n"));
  </script>
</job>

Обратите внимание, что, как указывает @Robert Harvey, это может занять очень много времени, если корневой ключ слишком глубоко связан. Простое тестирование занимает всего несколько секунд на ключ, который я выбрал, но ваш пробег может варьироваться; конечно, никаких гарантий или пригодности для какой-либо цели, не вините меня, если ваш компьютер взорвался.

1 голос
/ 13 мая 2010

http://code.google.com/p/jslibs/

если вы не найдете его там, вы должны реализовать его самостоятельно

...