专业编程基础技术教程

网站首页 > 基础教程 正文

无需手动干预!通过Python脚本实现EXE程序的静默安装与卸载

ccvgpt 2025-03-20 12:47:05 基础教程 12 ℃

引言:

封装的类主要实现了、终止指定进程 (win_process)、安装 EXE 程序 (install_exe)、卸载 EXE 程序 (uninstall_exe)

终止指定进程:遍历所有正在运行的进程,并根据配置文件中的 exe_process_name 找到并终止相关进程。

无需手动干预!通过Python脚本实现EXE程序的静默安装与卸载

安装 EXE 程序:获取EXE 程序路径和目标安装路径,构造并执行静默安装命令(即不需要用户交互的安装),通过 subprocess.run() 执行命令,并输出安装结果。

卸载 EXE 程序:通过配置文件获取安装路径,然后调用卸载程序(通常是 uninstall.exe)来静默卸载程序。如果当前用户没有管理员权限,则抛出异常提示权限不足。

import ctypes
import os
import psutil
import subprocess
from Public_Config.PublicConfig import ConfigYaml

class ExE:

    def win_process(self):
        """杀掉所有指定进程"""
        #todo 遍历所有正在运行的进程
        for process in psutil.process_iter():
            try:
                #todo 获取进程的PID和名称
                processinfo = process.as_dict(attrs=['pid', 'name'])
                #todo 如果进程名称匹配配置文件中定义的exe进程名,则杀掉该进程
                if processinfo['name'] == ConfigYaml().get_exe_process_name():
                    print(f"Killing process: {processinfo['name']} with PID: {processinfo['pid']}")
                    process.kill()
            except psutil.NoSuchProcess:
                #todo 捕获进程不存在的异常,忽略并继续处理
                pass

    def install_exe(self):
        """安装exe程序到指定目录"""
        #todo 从配置文件获取exe程序路径和目标安装路径
        exe_path = ConfigYaml().get_exe_path()
        install_path = ConfigYaml().get_exe_install_path()
        
        #todo 构造命令行以静默安装exe程序
        cmd = f'"{exe_path}" /S /D="{install_path}"'  #todo /S:静默安装,/D:指定安装目录
        print(f"Running installation command: {cmd}")
        
        #todo 使用subprocess运行安装命令,捕获输出和错误信息
        result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        
        #todo 检查安装命令的返回码,0表示成功
        if result.returncode == 0:
            print("Exe has been installed successfully.")
        else:
            #todo 输出错误信息,捕获并解码为cp936编码(针对中文环境)
            print("Error during installation:", result.stderr.decode("cp936"))

    def uninstall_exe(self):
        """根据exe程序自带的uninstall.exe卸载程序"""
        if os.name == 'nt':  #todo 仅在Windows平台下进行操作
            #todo 判断当前用户是否具有管理员权限
            if ctypes.windll.shell32.IsUserAnAdmin() != 1:
                raise Exception('Insufficient privileges, unable to uninstall the program!')
        
        #todo 获取安装路径并执行卸载命令
        uninstall_cmd = f'"{ConfigYaml().get_exe_install_path()}/uninstall.exe" /S'  #todo /S:静默卸载
        print(f"Running uninstallation command: {uninstall_cmd}")
        
        #todo 使用subprocess运行卸载命令,捕获输出和错误信息
        result = subprocess.run(uninstall_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
        
        #todo 检查卸载命令的返回码,0表示成功
        if result.returncode == 0:
            print("Exe has been uninstalled successfully.")
        else:
            #todo 输出错误信息,捕获并解码为cp936编码(针对中文环境)
            print("Error during uninstallation:", result.stderr.decode("cp936"))

if __name__ == '__main__':
    #todo 在这里通常会调用ExE类的方法,例如:
    #todo exe = ExE()
    #todo exe.install_exe()
    #todo exe.uninstall_exe()
    pass


需要注意的地方:

  1. 权限问题:在进行卸载操作时,确保程序的执行者具备管理员权限,否则会导致卸载失败。
  2. 平台兼容性:当前代码假设操作系统为 Windows,如果在其他平台上运行,需要调整特定的 Windows API 调用(如管理员权限检查、安装路径、卸载命令等)。
  3. 静默安装/卸载参数:确保 EXE 程序本身支持 /S 静默模式(许多安装程序支持此参数,但不是所有程序都支持)。如果安装或卸载程序不支持静默模式,用户将看到安装或卸载界面,可能会影响自动化流程。

Tags:

最近发表
标签列表