使用 Python 创建 Windows 程序列表生成器:从安装程序到配置文件

news2024/12/24 22:00:53

在当今的数字时代,我们的计算机上安装了数不胜数的程序。但是,您是否曾想过如何快速获取所有已安装程序的列表,并将其转化为可用的配置文件?今天,我们将探讨如何使用 Python 创建一个强大的工具,它不仅可以列出 Windows 系统中所有已安装的程序,还能生成一个包含这些程序信息的配置文件。

项目概述

我们的项目名为"Windows 程序列表生成器",它主要完成两个任务:

  1. 扫描并列出 Windows 系统中所有已安装的程序。
  2. 根据扫描结果生成一个配置文件,其中包含每个程序的详细信息。

这个工具可以帮助系统管理员快速审计已安装的软件,协助开发者创建启动器应用程序,或者simply帮助用户整理他们的软件库。
C:\pythoncode\new\shortcut.py

全部代码

import wx
import os
import winreg
import configparser
import subprocess

def get_installed_programs():
 programs = []
 
 # 方法 1: 使用 PowerShell 命令获取已安装的应用程序
 command = "Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*, HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, InstallLocation | Where-Object { $_.DisplayName -ne $null }"
 result = subprocess.run(["powershell", "-Command", command], capture_output=True, text=True)
 
 for line in result.stdout.strip().split('\n'):
     if line and not line.startswith("DisplayName"):
         parts = line.split(None, 1)
         if len(parts) == 2:
             name, install_location = parts
             if install_location and install_location.strip() != "":
                 exe_path = os.path.join(install_location.strip(), f"{name.strip()}.exe")
                 if os.path.exists(exe_path):
                     programs.append((name.strip(), exe_path))
 
 # 方法 2: 使用 winreg 直接访问注册表
 for hive in [winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER]:
     for key_path in [
         r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
         r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
     ]:
         try:
             with winreg.OpenKey(hive, key_path) as key:
                 for i in range(winreg.QueryInfoKey(key)[0]):
                     try:
                         subkey_name = winreg.EnumKey(key, i)
                         with winreg.OpenKey(key, subkey_name) as subkey:
                             try:
                                 name = winreg.QueryValueEx(subkey, "DisplayName")[0]
                                 install_location = winreg.QueryValueEx(subkey, "InstallLocation")[0]
                                 if install_location:
                                     exe_path = os.path.join(install_location, f"{name}.exe")
                                     if os.path.exists(exe_path):
                                         programs.append((name, exe_path))
                             except FileNotFoundError:
                                 continue
                     except WindowsError:
                         continue
         except WindowsError:
             continue

 # 方法 3: 搜索常见的程序文件夹
 common_folders = [
     os.environ.get('ProgramFiles'),
     os.environ.get('ProgramFiles(x86)'),
     os.path.join(os.environ.get('LocalAppData'), 'Programs')
 ]
 
 for folder in common_folders:
     if folder:
         for root, dirs, files in os.walk(folder):
             for file in files:
                 if file.endswith('.exe'):
                     full_path = os.path.join(root, file)
                     name = os.path.splitext(file)[0]
                     programs.append((name, full_path))

 return list(set(programs))  # 去除重复项

class MainFrame(wx.Frame):
 def __init__(self):
     super().__init__(parent=None, title='Windows 11 Program Lister')
     panel = wx.Panel(self)
     
     self.list_box = wx.ListBox(panel, pos=(10, 10), size=(580, 300))
     generate_button = wx.Button(panel, label='Generate Config', pos=(10, 320))
     generate_button.Bind(wx.EVT_BUTTON, self.on_generate)
     
     self.populate_list()
     self.Show()

 def populate_list(self):
     programs = get_installed_programs()
     for program in programs:
         self.list_box.Append(f"{program[0]}: {program[1]}")

 def on_generate(self, event):
     config = configparser.ConfigParser()
     
     for i in range(self.list_box.GetCount()):
         item = self.list_box.GetString(i)
         name, path = item.split(': ', 1)
         section = f"Button{i+1}"
         config[section] = {
             "Caption": name,
             "Link": path,
             "Color": "clGreen",
             "Width": "150",
             "Height": "70"
         }
     
     with open('buttons.ini', 'w', encoding='utf-8') as configfile:
         config.write(configfile)
     
     wx.MessageBox(f'Config file generated successfully with {self.list_box.GetCount()} buttons!', 'Info', wx.OK | wx.ICON_INFORMATION)

if __name__ == '__main__':
 app = wx.App()
 frame = MainFrame()
 app.MainLoop()

技术栈

我们将使用以下技术和库来实现这个项目:

  • Python:主要编程语言
  • wxPython:用于创建图形用户界面
  • winreg:用于访问 Windows 注册表
  • configparser:用于生成配置文件
  • subprocess:用于执行 PowerShell 命令

实现过程

1. 获取已安装程序列表

获取已安装程序列表是最具挑战性的部分。我们采用了三种方法来确保尽可能多地捕获已安装的程序:

a) 使用 PowerShell 命令:

command = "Get-ItemProperty HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*, HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* | Select-Object DisplayName, InstallLocation | Where-Object { $_.DisplayName -ne $null }"
result = subprocess.run(["powershell", "-Command", command], capture_output=True, text=True)

b) 直接访问 Windows 注册表:

for hive in [winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER]:
    for key_path in [
        r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
        r"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
    ]:
        # 遍历注册表项

c) 搜索常见的程序文件夹:

common_folders = [
    os.environ.get('ProgramFiles'),
    os.environ.get('ProgramFiles(x86)'),
    os.path.join(os.environ.get('LocalAppData'), 'Programs')
]

2. 创建图形用户界面

我们使用 wxPython 创建了一个简单的图形界面,包含一个列表框来显示找到的程序,以及一个按钮来触发配置文件的生成。

class MainFrame(wx.Frame):
    def __init__(self):
        super().__init__(parent=None, title='Windows 11 Program Lister')
        panel = wx.Panel(self)
        
        self.list_box = wx.ListBox(panel, pos=(10, 10), size=(580, 300))
        generate_button = wx.Button(panel, label='Generate Config', pos=(10, 320))
        generate_button.Bind(wx.EVT_BUTTON, self.on_generate)

3. 生成配置文件

当用户点击"Generate Config"按钮时,我们会为每个找到的程序创建一个配置项:

def on_generate(self, event):
    config = configparser.ConfigParser()
    
    for i in range(self.list_box.GetCount()):
        item = self.list_box.GetString(i)
        name, path = item.split(': ', 1)
        section = f"Button{i+1}"
        config[section] = {
            "Caption": name,
            "Link": path,
            "Color": "clGreen",
            "Width": "150",
            "Height": "70"
        }
    
    with open('buttons.ini', 'w', encoding='utf-8') as configfile:
        config.write(configfile)

使用说明

  1. 确保安装了所需的库,特别是 wxPython:pip install wxPython
  2. 以管理员权限运行脚本
  3. 程序会显示一个窗口,列出所有找到的已安装程序
  4. 点击"Generate Config"按钮,会在脚本所在目录生成 buttons.ini 文件

潜在应用

  1. 系统审计:IT 管理员可以快速获取系统上安装的所有软件列表。
  2. 软件启动器:开发者可以使用生成的配置文件来创建自定义的程序启动器。
  3. 软件清理:用户可以基于这个列表识别并删除不需要的程序。
  4. 自动化脚本:配置文件可以被其他脚本用来批量操作或分析已安装的软件。

结果如下

在这里插入图片描述
在这里插入图片描述

结语

通过这个项目,我们展示了如何利用 Python 的强大功能来创建一个实用的系统工具。虽然这个工具主要针对 Windows 系统,但类似的概念可以应用到其他操作系统上。希望这个项目能激发你的创意,帮助你开发出更多有趣且实用的工具!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览,旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾,我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

【私有云场景案例分享①】高效的集群管理能力

一、前言 设备的管理对企业至关重要,会影响生产效率、成本控制和竞争力。然而,企业在设备管理上面临设备数量多、设备分布广、维护成本高等挑战。DeviceKeeper设备管理网站作为解决方案,可以通过远程设备监控、远程设备维护和包体共享等功能…

制造业MES系统源码,前端框架:vue.js,后端框架:springboot 功能模块包括:生产计划管理、物料管理、工艺管理、设备管理、

MES系统功能模块解析,MES系统源码 MES系统是一种用于协调和优化制造过程的信息管理系统,可以帮助企业实现生产计划的顺利执行,并提供全面的生产监控和数据分析功能。 MES系统常见的功能模块包括生产计划管理、物料管理、工艺管理、设备管理…

如何把Phalcon 集成到PhpStorm里面

一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…

音频剪辑在线工具哪个好?分享5款简单易上手的音频剪辑工具

暑期的泰山人山人海,游客们纷纷涌向这座名胜古迹。站在巍峨的泰山之巅,望着脚下绵延的群山和眼前无边的云海,人们不禁会想要记录下这一刻的声音。 但泰山的风声、游客的喧哗声、还有自然与人文的杂音交织在一起,要想将这声音中的…

【人工智能】 使用线性回归预测波士顿房价 paddlepaddle 框架 飞桨

一、简要介绍 经典的线性回归模型主要用来预测一些存在着线性关系的数据集。 回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线,则称为线性回归。 如果是一条二次曲线,则被称为二次回归。 线性回归是回归模型中最简单的一种。 本…

机房监控系统,全面监控机房动力环境实时报警@卓振思众

在现代企业运营中,机房作为计算机系统的核心支撑平台,承载着关键数据和应用的稳定运行。因此,保障机房环境的安全和设备的正常运行至关重要。【卓振思众】机房监控系统,作为一种先进的智能管理工具,正是为了实现这一目…

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题(TSP&#xff…

Halcon阈值处理的几种分割方法

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

982200419控制燃烧器可面价

982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器接线图 982200419控制燃烧器说明书 982200419控制燃烧器线路图 982200419燃烧机也叫燃烧器,按照燃料可分为燃油燃烧机和燃气燃烧机、生物质燃烧机&#x…

胡玫导演《红楼梦之金玉良缘》今日公映 李越版“琏二爷”实力不凡

今日,由胡玫执导,何燕江编剧,林鹏、卢燕、边程、张淼怡、李越等主演的电影《红楼梦之金玉良缘》全国公映。电影改编自曹雪芹不朽名著《红楼梦》,以“宝、黛、钗”三人的情缘纠葛入手,从“木石前盟”看“金玉良缘”&…

YOLOv8更换主干网络成MobileNetV3

目录 1. 添加主干网络模块 ​编辑1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 1. 添加主干网络模块 1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 自己随便找一个程序跑一跑验证…

Idea使用Maven下载源码

如题,Idea中使用Maven下载源码提示Cannot download sources for xxx。原因是在对应的镜像站没有找到源码包。笔者尝试下载spring-web-4.3.0.RELEASE的源码包时提示如此,原因是配置的阿里云镜像站没有上传对应的源码包,配置了华为镜像站后就可…

Linux(离线)内网部署 thingsboard-gateway 网关实战modbus通讯

前面我们讲解了在内网上如何部署Thingsboard,部署之后领导又要求部署上网关,然后通过modbus来监听设备,废话不多说,直接上干活。 第一步:下载thingsboard-gateway安装包 在Thingsboard官网中给了我们一个在线安装的地…

考勤系统微信小程序的设计与实现---附源码29756

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3微信小程序的介绍 2考勤系统微信小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

计算机的错误计算(六十)

摘要 用另一种方法计算计算机的错误计算(五十五)中案例:先使自变量与 取余,再计算取余后的余弦值,这时,得到了不同的输出。因此,即使不清楚正确结果,Python 与 Visual Studio 也各自…

TypeError when using openai-api

题意:使用 openai-api 时出现 TypeError(类型错误) 问题背景: Using the code below and openai version 0.28.0 i get an error which i cant resolve: 使用以下代码和 openai 版本 0.28.0 时,我遇到了一个无法解决…

软中断、Tasklet 与工作队列的机制分析

文章目录 1 软中断(Softirq)1.1 概念与背景1.2 特点与执行1.3 触发与执行方式1.4 实现与使用1.5 软中断的替代机制 2 Tasklet2.1 概念与特点 3 Bottom Halves(BH)3.1 概念与历史 4 工作队列(Workqueue)4.1 …

ElasticSearch集群搭建与安全认证

文章目录 核心概念集群节点分片CAT API查看集群信息 搭建三节点ES集群安装ES安装Cerebro客户端安装kibana ES集群安全认证ES敏感信息泄露的原因免费的方案集群内部安全通信开启并配置X-Pack的认证 核心概念 集群 一个集群可以有一个或者多个节点不同的集群通过不同的集群名来…

百度百科创建收费吗

百度百科作为一个开放的网络百科全书,旨在为用户提供丰富的知识信息。根据百度百科的官方声明,创建百度百科词条是完全免费的。任何人都可以自由编辑、修改和添加条目。百度百科的创建和编辑过程是由用户自发进行的,不存在官方收费的情况。 百…