1

Python で WinReg を使用しようとしていますが、障害に直面しています。次のコードは、返された各エントリのキー:値を持つ辞書を返すことになっています。同じキー:値を取得していることに気付きました。

このコードを編集して別の値を取得するにはどうすればよいですか?

import _winreg
def subkeys(key):
    i = 0
    while True:
        try:
            subkey = _winreg.EnumKey(key, i)
            yield subkey
            i+=1
        except WindowsError as e:
            break

def traverse_registry_tree(hkey, keypath, tabs=0):
    reg_dict = {}
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    for subkeyname in subkeys(key):
        reg_dict[subkeyname] = subkeyname
    return reg_dict

keypath = r"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"

print traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath)

出力は次のようになります。

{'Mozilla Firefox 40.0.2 (x86 en-US)': 'Mozilla Firefox 40.0.2 (x86 en-US)', 'IE40': 'IE40', 'Connection Manager': 'Connection Manager'}

とにかく私は高度なpythonistではないことに注意してください。

4

1 に答える 1

3

関数に再帰するたびにtraverse_registry_tree、新しい辞書を作成します。したがって、各ディクショナリにはキーが 1 つしかありません。

再帰呼び出しでは戻り値で何もしないので、これが間違っていることがわかります。外部呼び出しは戻り値を出力しますが、内部呼び出しは出力しません。

これは、再帰呼び出しからの戻り値を作成中の辞書にパックすることで修正できます。しかし、それは再帰呼び出しの内外で辞書全体を渡すほど効率的ではありません。

def traverse_registry_tree(hkey, keypath, reg_dict):
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    reg_dict[keypath] = key
    for subkey in subkeys(key):
        subkeypath = "%s\\%s" % (keypath, subkey)
        traverse_registry_tree(hkey, subkeypath, reg_dict)

reg_dict = {}
keypath = r"SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
traverse_registry_tree(_winreg.HKEY_LOCAL_MACHINE, keypath, reg_dict)

print(reg_dict)

レジストリ値 (およびキー) にアクセスする方法も尋ねているかどうかわかりませんか? もしそうなら、これもそれを行うためのいくつかのコードです:

def get_values(key):
    key_dict = {}
    i = 0
    while True:
        try:
            subvalue = _winreg.EnumValue(key, i)
        except WindowsError as e:
            break
        key_dict[subvalue[0]] = subvalue[1:]
        i+=1
    return key_dict

def traverse_registry_tree(hkey, keypath, reg_dict):
    key = _winreg.OpenKey(hkey, keypath, 0, _winreg.KEY_READ)
    reg_dict[keypath] = get_values(key)
    for subkey in subkeys(key):
        subkeypath = "%s\\%s" % (keypath, subkey)
        traverse_registry_tree(hkey, subkeypath, reg_dict)
于 2015-08-24T07:07:07.103 に答える