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

liftword1个月前 (03-23)技术文章9

引言:

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

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

安装 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 静默模式(许多安装程序支持此参数,但不是所有程序都支持)。如果安装或卸载程序不支持静默模式,用户将看到安装或卸载界面,可能会影响自动化流程。

相关文章

python如何彻底卸载

要想彻底干净的卸载python,如果是使用的安装版的话,其实很简单。就是点击安装包。例如,当前你安装的版本是3.6.5,你想要把它卸载掉。查看python版本的命令:只需要点击对应版本的安装包:点击卸...

如何干净删除python

先打开geek,趁着python没注意,咱们搞偷袭,右键一下子卸载掉然后打开everything,删掉c盘一些python主目录(以前安装的目录,如果删不掉,右键点开 在文件夹 安全里 调整下权限 之...

python删除文件和删除目录的方法

下面来看一下python里面是如何删除一个文件及文件夹的~~首先引入OS模块import os删除文件: os.remove()删除空目录: os.rmdir()递归删除空目录: os.removed...

Mac下安装与卸载Python3操作方式

1、在安装最新版Python3的版本之前,我们先熟悉一下系统自带的python。  Mac系统自带python路径为/System/Library/Frameworks/Python.framewor...

使用 Python 在 Excel 中创建、引用、导出、更新和删除命名范围

Excel 中的命名区域是分配给特定单元格区域(如“SalesData”或“Revenue”)的用户定义标识符。通过使用有意义的名称而不是 A1:B10 等标准单元格引用,命名区域可以更轻松地引用数据...