用啥学啥,最近根据项目要求,用python写了个读取windows系统已安装软件的版本号。
原理是读取系统注册表里的卸载Uninstall数据,这正是控制面板-程序和功能中显示的列表信息,只要在列表中显示的软件,都能读取版本,如果有这个值的话。
对应的键是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
这里使用python自带的_winreg库读取注册表,需要注意的是,如果python安装的是32位版本,读取上面第一行不带Wow6432Node的键,会自动定位到Wow6432Node的键上,所以推荐安装64位的Python。
下面是完整文件,核心是使用_winreg的OpenKey方法与QueryValueEx方法,然后利用while循环遍历。
# -*- coding: utf-8 -*- import _winreg import sys def closeReg(key): _winreg.CloseKey(key) def openReg(key): return _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,key) def queryVal(key,name): (value, type) = _winreg.QueryValueEx(key,name) return value def find(keypath,softname): key = openReg(keypath) i=0 result = "" try: while 1: name= _winreg.EnumKey(key,i) path = keypath+"\\"+name subkey = openReg(path) try: value = queryVal(subkey,'DisplayName') if softname in value: value = queryVal(subkey,'DisplayVersion') result = value closeReg(subkey) break except: pass finally: closeReg(subkey) i+=1 except: pass closeReg(key) return result def main(): arg = sys.argv if len(arg)<2: print u"请输入参数" else: keypath1 = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" keypath2 = r"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" val = find(keypath1,arg[1]) if val == "": val = find(keypath2, arg[1]) print val if __name__=="__main__": main()
使用方法:
getversion.py Firfox