无需手动干预!通过Python脚本实现EXE程序的静默安装与卸载
引言:
封装的类主要实现了、终止指定进程 (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
需要注意的地方:
- 权限问题:在进行卸载操作时,确保程序的执行者具备管理员权限,否则会导致卸载失败。
- 平台兼容性:当前代码假设操作系统为 Windows,如果在其他平台上运行,需要调整特定的 Windows API 调用(如管理员权限检查、安装路径、卸载命令等)。
- 静默安装/卸载参数:确保 EXE 程序本身支持 /S 静默模式(许多安装程序支持此参数,但不是所有程序都支持)。如果安装或卸载程序不支持静默模式,用户将看到安装或卸载界面,可能会影响自动化流程。