当前位置: 首页 > 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系统中安装的所有应用程序。

相关文章:

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

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

springboot基础及上传组件封装

简介 本文主要以文件上传为demo,介绍了一些 springboot web 开发的入门的技术栈。 对应刚接触 springboot 的可以参考下。 主要包括文件md5比对、生成图片缩略图、数据库迁移、文件记录持久化、请求全局异常处理等功能。 准备工作 在 idea 中创建项目&#xff…...

WHAT - package.json 解释

目录 一、前言二、介绍2.1 package.json 文件示例2.2 关键字段2.3 常用命令2.4 自定义脚本 三、element-plus 完整示例3.1 main 和 module1. main 字段2. module 字段3. 综合示例 3.2 types1. 示例2. TypeScript 类型定义文件的作用3. 类型定义文件示例4. 发布带有类型定义的包…...

Python知识点14---被规定的资源

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…...

文献阅读:GCNG:用于从空间转录组数据推断基因相互作用的图卷积网络

文献介绍 「文献题目」 GCNG: graph convolutional networks for inferring gene interaction from spatial transcriptomics data 「研究团队」 Ziv Bar-Joseph(美国卡内基梅隆大学) 「发表时间」 2020-12-10 「发表期刊」 Genome Biology 「影响因子…...

Mybatis第一讲——你会Mybatis吗?

文章目录 什么是MybatisMybatis的作用是什么 Mybatis 怎么使用注解的方式注解的多种使用Options注解ResultType注解 XML的方式update标签 #{} 和 ${}符号的区别#{}占位${}占位 ${}占位的危险性(SQL注入)数据库连接池 什么是Mybatis 首先什么是Mybatis呢?Mybatis是一…...

【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理

【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理 问题背景: 在鸿蒙中UI更新渲染的机制,与传统的Android IOS应用开发相比。开发会简单许多,开发效率提升显著。 一般传统应用开发的流程处理分为三步:1.画UI,…...

PostgreSQL基础(六):PostgreSQL基本操作(二)

文章目录 PostgreSQL基本操作(二) 一、字符串类型 二、日期类型 三、...

【前端部署——vercel】部署next.js使用了prisma的项目

部署流程参考 https://blog.csdn.net/qq_51116518/article/details/137042682 问题 PrismaClientInitializationError: Prisma has detected that this project was built on Vercel, which caches dependencies. This leads to an outdated Prisma Client because Prisma’s …...

Vue插槽与作用域插槽

title: Vue插槽与作用域插槽 date: 2024/6/1 下午9:07:52 updated: 2024/6/1 下午9:07:52 categories: 前端开发 tags:VueSlotScopeSlot组件通信Vue2/3插槽作用域API动态插槽插槽优化 第1章:插槽的概念与原理 插槽的定义 在Vue.js中,插槽(…...

类和对象(一)(C++)

类和对象: 类的引入: C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语言方式实现的栈,结构体中只能定义变量&#…...

【免费Web系列】JavaWeb实战项目案例六

这是Web第一天的课程大家可以传送过去学习 http://t.csdnimg.cn/K547r 员工信息-删除&修改 前面我们已经实现了员工信息的条件分页查询以及新增操作。 关于员工管理的功能,还有两个需要实现: 删除员工 修改员工 除了员工管理的功能之外&#x…...

git分布式版本控制系统(四)

目前世界上最先进的分布式版本控制系统 官方网址:https://git-scm.com 学习目标: 1 了解 git 前世今生 2 掌握 git 基础概念、基础操作 3 各种 git 问题处理 4 互联网常用 gitflow(工作流程规范) 5 git 代码提交规范 6 git 分支管理及命名规范 常见问…...

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种,如果是切换 Hash 的方式,那么依靠浏览器 Hash 变化即可;如果是切换网址中的 Path,就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时,还需要在…...

Django里多app

在 Django 里的某一个项目,里面得包含很多 App (功能),那么如何在该项目里管理这么多App呢? 先说明下背景:未先创建 apps 文件夹来存各个app文件夹,直接在项目文件目录里创建各个app。为了便于管理,得将各…...

Prime1 - 信息收集和分析能力的试炼

主机发现 nmap扫描与分析 端口22、80 详细扫描;linux、ubuntu、 udp扫描 端口都是关闭的 脚本扫描 web渗透 打开只有一张图片;源码有图片和一个alt:hnp security不知道有啥用,先记录下来吧 继续web渗透思路走吧,目录…...

3.location的写法

location的写法 一、location的写法1、 精确匹配2、~ 以正则表达式匹配请求,区分大小写3、~* 以正则匹配请求,不区分大小写4、^~ 不以正则的方式匹配请求 二、stub_status模块显示工作状态三、url地址重写 rewrite模块1、语法2、针对项目结构有变化3、网…...

AndroidStudio设置允许APP获取定位权限

1. 在AndroidManifest.xml中声明权限 常用的定位权限有以下两种&#xff1a; <uses-permission android:name"android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION"/>2. …...

Spring Boot 统一数据返回格式

在 Spring Boot 项目中&#xff0c;统一的数据格式返回是一种良好的实践&#xff0c;它提高了代码的可维护性和一致性&#xff0c;并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…...

Android 项目Gradle文件讲解(Groovy和Kotlin)

Android 项目Gradle文件讲解&#xff08;Groovy和Kotlin&#xff09; 前言正文一、Gradle的作用二、Gradle的种类① 工程build.gradle② 项目build.gradle③ settings.gradle④ gradle.properties⑤ gradle-wrapper.properties⑥ local.properties 三、Groovy和Kotlin的语言对比…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...