Python脚本读取系统已安装软件的版本号

By | 2017年11月24日

用啥学啥,最近根据项目要求,用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