当前位置: 首页 > news >正文

用Python获取Windows本机安装的所有应用程序的实现与分析

一个项目中需要获取本机安装的所有应用程序列表,花了一点时间研究了一下,分享出来。
主要通过访问注册表和桌面快捷方式来完成这一任务,因为注册表中获取到的应用程序列表不完全,因此通过桌面快捷方式进行补充。

导入所需模块
import winreg
import win32com.client
from pathlib import Path
  • winreg:用于访问Windows注册表。
  • win32com.client:用于处理Windows快捷方式。
  • Path:用于处理文件和目录路径。
通过注册表获取安装的应用程序
def get_installed_apps_from_registry():"""通过注册表查询安装的应用"""apps = {}try:# 定义要查询的注册表路径reg_paths = [r"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",r"SOFTWARE\\WOW6432NODE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"]# 遍历所有注册表路径for reg_path in reg_paths:with winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, reg_path) as key:for i in range(winreg.QueryInfoKey(key)[0]):sub_key_name = winreg.EnumKey(key, i)with winreg.OpenKey(key, sub_key_name) as sub_key:try:app_name = winreg.QueryValueEx(sub_key, "DisplayName")[0]# 排除驱动程序if "驱动程序" in app_name:continueapp_path = winreg.QueryValueEx(sub_key, "DisplayIcon")[0]# 对 exe 路径进行过滤和清洗if "exe" in app_path:app_path = app_path.replace('"', '')# 有一些 exe 文件的路径是以逗号分隔的,只取第一个app_path = app_path.split(",")[0]apps[app_name] = {"path": app_path}except FileNotFoundError:passexcept Exception as e:print(f"Error: {e}")return apps

此函数执行以下操作:

  1. 定义注册表中存储已安装应用程序信息的路径。
  2. 遍历这些路径,并获取每个应用程序的名称和可执行文件路径。
  3. 过滤掉包含“驱动程序”的应用名称,清洗路径信息,构建应用程序字典。
获取桌面上的快捷方式
def get_shortcuts_on_desktop():"""查询桌面上安装的应用程序快捷方式"""desktop_path = Path.home() / "Desktop"shortcuts = {}for item in desktop_path.iterdir():if item.suffix == ".lnk":shortcut_name = item.stemshortcuts[shortcut_name] = {"path": item}return shortcuts

此函数执行以下操作:

  1. 获取桌面目录路径。
  2. 遍历桌面上的所有文件,筛选出扩展名为.lnk(快捷方式)的文件,并保存其路径和名称。
根据快捷方式获取目标路径
def get_target_path_by_shortcut(shortcut_path):"""根据快捷方式获取应用程序的可执行文件(exe)路径:param shortcut_path: 快捷方式路径:return: 可执行文件(exe)路径"""shell = win32com.client.Dispatch("WScript.Shell")shortcut = shell.CreateShortcut(shortcut_path)target_path = shortcut.TargetPathreturn target_path

此函数执行以下操作:

  1. 使用win32com.client模块来解析快捷方式。
  2. 获取快捷方式所指向的目标路径,即应用程序的可执行文件路径。
合并注册表和桌面快捷方式的信息
def get_installed_apps_dict():"""获取本机安装的所有应用程序:return: 安装的应用程序字典"""installed_apps = get_installed_apps_from_registry()desktop_shortcuts = get_shortcuts_on_desktop()merged_apps = {}# 合并安装的应用程序和桌面快捷方式for app_name, app_info in installed_apps.items():merged_apps[app_name] = {"path": app_info["path"]}# 添加在桌面快捷方式中存在但未在安装应用程序中列出的软件for app_name, shortcut_info in desktop_shortcuts.items():if app_name not in installed_apps:shortcut_path = str(shortcut_info["path"])merged_apps[app_name] = {"path": get_target_path_by_shortcut(shortcut_path)}return merged_apps

此函数执行以下操作:

  1. 获取注册表中安装的应用程序和桌面上的快捷方式。
  2. 合并这两部分信息,确保所有应用程序都包含在结果中。
  3. 如果一个应用程序在桌面快捷方式中存在但未在注册表中列出,则从快捷方式获取其路径。
主程序入口
if __name__ == '__main__':app_list = get_installed_apps_dict()for name, info in app_list.items():print(f"App Name: {name}")print(f"Executable Path: {info['path']}")print()print(f"Total Apps: {len(app_list)}")

主程序入口执行以下操作:

  1. 获取所有安装的应用程序列表。
  2. 打印每个应用程序的名称和路径。
  3. 输出总的应用程序数量。

通过这些步骤,该脚本能够有效地获取并列出Windows系统中安装的所有应用程序。

相关文章:

  • npm镜像源管理、nvm安装多版本node异常处理
  • 【算法实战】每日一题:17.1 订单处理问题(差分思想,二分搜索)
  • 【数据库系统概论】数据库设计过程
  • 我的app开始养活我了
  • linux暴力破解漏洞利用
  • 扑克牌游戏
  • 开封市建筑设计资质在线申报系统操作演示
  • python虚拟环境venv的安装--ubuntu
  • Arm发布Cortex X925、A725、A520,Armv9.2架构
  • Java如何实现pdf转base64以及怎么反转?
  • Java通过Html(ftl模板)生成PDF实战, 可支持商用
  • 从零学会【分镜头意识】拍摄思维
  • 一个与 WSL2 建立远程的简单方法
  • 基于朴素贝叶斯算法的新闻类型预测,django框架开发,前端bootstrap,有爬虫有数据库
  • 数字认证携手华为鸿蒙生态,升级智慧办公新体验
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • C# 免费离线人脸识别 2.0 Demo
  • C语言笔记(第一章:C语言编程)
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Node项目之评分系统(二)- 数据库设计
  • Promise面试题2实现异步串行执行
  • Protobuf3语言指南
  • Sass Day-01
  • storm drpc实例
  • TCP拥塞控制
  • windows下使用nginx调试简介
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 自动记录MySQL慢查询快照脚本
  • const的用法,特别是用在函数前面与后面的区别
  • raise 与 raise ... from 的区别
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​数据结构之初始二叉树(3)
  • !!java web学习笔记(一到五)
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (二)c52学习之旅-简单了解单片机
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (黑马C++)L06 重载与继承
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .Net Core 笔试1
  • .NET MVC之AOP
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .net操作Excel出错解决
  • .NET上SQLite的连接