3

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.

Products キー内には、インストールされている製品がリストされていますが、それらのキーはハッシュ コードとして定義されています。プロダクト キー内には、定義された名前と定義された値を持つ他のキーがあります。後者のキーと値を検索できるようにしたい。未知のハッシュコードをバイパスして、どうすればそれを行うことができますか?

たとえば、DisplayVersion キー = 1.0.0 の製品を見つける必要があります。そのキーへのパスは次のとおりです。

HKLM\Software\Microsoft\Windows\CurrentVersion\Installer\UserData\Products\A949EBE4EED5FD113A0CB40EED7D0258\InstallProperties\DisplayVersion.

プロダクト キー A949EBE4EED5FD113A0CB40EED7D0258 を入手する、または書かないようにするにはどうすればよいですか??

4

2 に答える 2

8

WScript.RegReadWindows Scripting Host 経由で JScript を使用していると仮定すると (ブラウザーからの JavaScript ではなく)、次のメソッドを使用して特定のキーの値を取得できます。

// 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" のレジストリ値がリーフ ノードである独自の再帰検索アルゴリズムを実装できます。

Windows Scripting Host 上の JScript に慣れるための演習として、まさにこれを行うレジストリへの小さなインターフェイスを作成しました。プロジェクトに含まれている例は、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 が指摘しているように、ルート キーの接続が深すぎると、これには非常に長い時間がかかる可能性があることに注意してください。簡単なテストは、選択したキーで数秒しかかかりませんが、マイレージは異なる場合があります。もちろん、保証も目的への適合性もありません。あなたのコンピュータが壊れたとしても、私を責めないでください。

于 2010-05-12T21:31:33.937 に答える
1

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

そこに見つからない場合は、自分で実装する必要があります

于 2010-05-12T20:36:30.340 に答える