问题描述
我正在尝试获取系统中安装的每个应用程序的安装目录,然后我会将这些目录存储在记事本或任何地方,然后访问该目录。所以基本上我想构建一个像 cortana 这样的 python 应用程序,它打开我系统中安装的任何应用程序并打开它。所以这就是我的想法
- 在winreg的帮助下从reg获取安装路径
- 然后存储它
- 然后使用其他 py 程序访问它,输入应用程序名称并在该文件中搜索,复制该特定应用程序的整个路径,然后将其发送到具有 os.open 和 application start 的 python 文件。
import winreg
def app(hive,flag):
areg=winreg.ConnectRegistry(None,hive)
akey=winreg.OpenKey(areg,r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",winreg.KEY_READ | flag)
subkey=winreg.QueryInfoKey(akey)[0]
soft_list=[]
for i in range(subkey):
soft={}
try:
soft['path']=winreg.QueryValueEx(subkey,"InstallSource")[0]
except:
soft['path']="null"
soft_list.append(soft)
return soft_list
soft_list = app(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_32KEY) + app(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_64KEY) + app(winreg.HKEY_CURRENT_USER,0)
for software in soft_list:
print (software['path'])
print(len(soft_list))
import winreg
def foo(hive,flag):
aReg = winreg.ConnectRegistry(None,hive)
aKey = winreg.OpenKey(aReg,winreg.KEY_READ | flag)
count_subkey = winreg.QueryInfoKey(aKey)[0]
software_list = []
for i in range(count_subkey):
software = {}
try:
asubkey_name = winreg.EnumKey(aKey,i)
asubkey = winreg.OpenKey(aKey,asubkey_name)
software['name'] = winreg.QueryValueEx(asubkey,"displayName")[0]
try:
software['i']=winreg.QueryValueEx(asubkey,"InstallSource")[0]
except EnvironmentError:
software['i'] = winreg.QueryValueEx(asubkey,"InstallSource")[0]
software_list.append(software)
except EnvironmentError:
continue
return software_list
software_list = foo(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_32KEY) + foo(winreg.HKEY_LOCAL_MACHINE,winreg.KEY_WOW64_64KEY) + foo(winreg.HKEY_CURRENT_USER,0)
for software in software_list:
print (software['name'],software['i'])
print('Number of installed apps: %s' % len(software_list))
下面的代码显示所有应用程序(352个应用程序)但是当我添加路径时代码不显示所有应用程序(205)
import winreg
def foo(hive,"displayName")[0]
software_list.append(software)
except EnvironmentError:
continue
return software_list
software_list = foo(winreg.HKEY_LOCAL_MACHINE,0)
for software in software_list:
print (software['name'])
print('Number of installed apps: %s' % len(software_list))
解决方法
您的问题没有好的答案。
您不会从注册表中找到所有安装路径。
此外,InstallSource
不会是安装路径,但它是源代码,并且经常丢失。
顺便说一句,我写了一个包来完成你上面编码的事情,叫做 windows_tools.installed_software
from windows_tools.installed_software import get_installed_software
for software in get_installed_software():
print(software['name'],software['version'],software['publisher'])
根据我的经验,没有什么好方法可以在 windows 下列出所有已安装的程序。
您可能需要结合各种来源,例如 WMI、注册表,也许还需要遍历 program files
和 program files (x86)
通过 WMI 获取数据的一种方法:
from windows_tools.wmi_queries import query_qmi
product = query_wmi('SELECT * FROM Win32_Product','cimv2','test_query',can_be_skipped=False)
for product in products:
print(product)
祝你好运。
,由于 anshul raj 要求一种获取所有可执行文件的方法以查找安装了哪些程序,因此这里提供了该问题的解决方案。 尽管如此,这只会列出路径中的所有可执行文件,并且会为具有多个可执行文件的现有程序产生大量结果。
from ofunctions.file_utils import get_files_recursive
program_paths = [r'C:\Program Files',r'C:\Program Files (x86)']
executables = []
for program_path in program_paths:
executables += get_files_recursive(program_path,ext_include_list=['.exe'])
print(executables)
免责声明:我是 ofunctions
模块的作者