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

一个项目中需要获取本机安装的所有应用程序列表,花了一点时间研究了一下,分享出来。

主要通过访问注册表和桌面快捷方式来完成这一任务,因为注册表中获取到的应用程序列表不完全,因此通过桌面快捷方式进行补充。

导入所需模块
python 复制代码
import winreg
import win32com.client
from pathlib import Path
  • winreg:用于访问Windows注册表。
  • win32com.client:用于处理Windows快捷方式。
  • Path:用于处理文件和目录路径。
通过注册表获取安装的应用程序
python 复制代码
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:
                                continue
                            app_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:
                            pass
    except Exception as e:
        print(f"Error: {e}")
    return apps

此函数执行以下操作:

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

此函数执行以下操作:

  1. 获取桌面目录路径。
  2. 遍历桌面上的所有文件,筛选出扩展名为.lnk(快捷方式)的文件,并保存其路径和名称。
根据快捷方式获取目标路径
python 复制代码
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.TargetPath
    return target_path

此函数执行以下操作:

  1. 使用win32com.client模块来解析快捷方式。
  2. 获取快捷方式所指向的目标路径,即应用程序的可执行文件路径。
合并注册表和桌面快捷方式的信息
python 复制代码
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. 如果一个应用程序在桌面快捷方式中存在但未在注册表中列出,则从快捷方式获取其路径。
主程序入口
python 复制代码
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系统中安装的所有应用程序。

相关推荐
雯0609~1 小时前
c#:winform调用bartender实现打印(学习整理笔记)
开发语言·c#
胜天半子_王二_王半仙2 小时前
c++源码阅读__smart_ptr__正文阅读
开发语言·c++·开源
沐泽Mu2 小时前
嵌入式学习-C嘎嘎-Day08
开发语言·c++·算法
Non importa2 小时前
汉诺塔(hanio)--C语言函数递归
c语言·开发语言·算法·学习方法
LinuxST2 小时前
27、基于Firefly-rk3399中断休眠唤醒实验(按键中断)
linux·开发语言·stm32·嵌入式硬件
Tony_long74832 小时前
Python学习——猜拳小游戏
开发语言·python·学习
跳动的梦想家h2 小时前
黑马点评 秒杀下单出现的问题:服务器异常---java.lang.NullPointerException: null(已解决)
java·开发语言·redis
ac-er88883 小时前
PHP 二分法查找算法
开发语言·算法·php
陈苏同学3 小时前
机器翻译 & 数据集 (NLP基础 - 预处理 → tokenize → 词表 → 截断/填充 → 迭代器) + 代码实现 —— 笔记3.9《动手学深度学习》
人工智能·pytorch·笔记·python·深度学习·自然语言处理·机器翻译
流着口水看上帝3 小时前
JavaScript完整原型链
开发语言·javascript·原型模式