如何使用Python模块_winreg遍历Windows注册表项的所有 值。我有代码可以执行我想要的操作,但它适用于指定注册表项的子项。
以下是代码:
from _winreg import *
t = OpenKey(HKEY_CURRENT_USER, r"PATH TO KEY", 0, KEY_ALL_ACCESS)
try:
i = 0
while True:
subkey = EnumValue(t, i)
print subkey
i += 1
except WindowsError:
# WindowsError: [Errno 259] No more data is available
pass
哦,想通了。但是,如果有人知道另一种方法,我仍然会接受这个答案!
答案 0 :(得分:7)
我更喜欢避免错误,而不是潜入其中......
使用_winreg.QueryInfoKey获取值的数量:
import _winreg
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'PATH\TO\KEY', 0, _winreg.KEY_READ)
for i in xrange(0, _winreg.QueryInfoKey(key)[1]):
print _winreg.EnumValue(key, i)
获取Keys的数量,相同的方法,不同的索引(原始问题的后半部分):
for i in xrange(0, _winreg.QueryInfoKey(key)[0]):
print _winreg.EnumKey(key, i)
注意:使用import
而不是from ... import
来明确函数和变量的来源。在以后的生活中更容易遵循代码。
答案 1 :(得分:4)
不应该EnumValue在这里有所帮助
# list all values for a key
try:
count = 0
while 1:
name, value, type = _winreg.EnumValue(t, count)
print repr(name),
count = count + 1
except WindowsError:
pass
答案 2 :(得分:0)
要迭代注册表的键和值,您需要EnumKey()
模块中的EnumVlaue()
和_winreg
方法。请注意,这两个方法将索引作为参数,并仅为给定索引提供键(或值)。因此,为了获取所有键(或值),您需要将索引递增1并继续直到WindowsError
未遇到。
This post可能会帮助您详细了解相同内容。代码的Github链接可以在帖子中找到。
答案 3 :(得分:0)
对于python 3
import winreg
hKey = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, "Local Settings\\Software\\Microsoft\\Windows\\Shell\\MuiCache")
try:
count = 0
while 1:
name, value, type = winreg.EnumValue(hKey, count)
print (name),
count = count + 1
except WindowsError as err:
print(err)
pass
答案 4 :(得分:0)
(Python3)使用生成器和递归,因为我不喜欢计数器...
def get_keys(self, path, i=0):
try:
yield winreg.EnumValue(winreg.OpenKey(winreg.HKEY_CURRENT_USER, path), i)
yield from get_keys(path, i+1)
except WindowsError as err:
pass
for name, value, type in r.get_keys(r"Local Settings\Software\Microsoft\Windows\Shell\MuiCache"):
print(f"{name} => {value} ({type})"