网站首页 > 技术文章 正文
方案一: 直接套用脚本
首先定义了 setup_file 变量来表示静默安装程序的路径,install_path 变量表示安装程序的安装目录。这两个变量需要根据实际情况进行设置。
然后,我们将静默安装程序的路径和参数放入 cmd变量中。这里使用了 /s 参数来执行静默安装,并使用 /D 参数来指定安装目录。
最后,我们使用 subprocess.run() 方法来运行静默安装程序,将 cmd变量作为参数传递给该方法。该方法会启动静默安装程序,并等待安装过程完成。此时安装过程将在后台运行,不会弹出任何对话框或提示框,直接安装。
import subprocess
# 静默安装程序路径,即exe程序存放文件夹
setup_file = 'path/node.exe'
# 安装程序的安装目录
install_path = 'D:/Program Files/InstallFolder/'
# cmd 中的/s 参数用于执行静默安装,/D 参数用于指定安装目录
cmd = [setup_file, '/s', '/D=' + install_path]
# 使用 subprocess 模块运行静默安装程序
subprocess.run(cmd)
首先定义了 uninstall_file 变量来表示静默卸载程序的路径(注意:uninstall.exe是安装程序默认有的卸载exe,有的程序没有此卸载exe,根据实际情况而定或替换),install_path 变量表示卸载程序的安装目录。这两个变量需要根据实际情况进行设置。
然后,我们将静默卸载程序的路径和参数放入 args 变量中。这里使用了 /silent 或 /S 参数来执行静默卸载。
最后,我们使用 subprocess.run() 方法来运行静默卸载程序,将 cmd变量作为参数传递给该方法。该方法会启动静默卸载程序,并等待卸载过程完成。此时卸载过程将在后台运行,不会弹出任何对话框或提示框,直接卸载
import subprocess
# 静默卸载程序路径
uninstall_file = 'path/uninstall.exe'
# 卸载程序的安装目录
install_path = 'D:/Program Files/InstallFolder/'
# cmd 中的 /silent 或 /S 参数用于执行静默卸载
cmd = [uninstall_file, '/silent']
# 使用 subprocess 模块运行静默卸载程序
subprocess.run(cmd)
方案二:直接调用封装脚本
脚本实现封装后,只需要在Exe.yaml文件中写用例即可,此后执行ExE.py脚本即可实现程序的安装、卸载
目录介绍:
Exe.yaml配置信息
exe_process_name:程序的进程名
exe_path: exe软件包存放的路径
exe_install_path:静默安装的路径
exe_uninstall_path:卸载程序所在的路径
EXE:
exe_process_name: node.exe
exe_path: D:\npp.exe
exe_install_path: D:\Program Files\Node
exe_uninstall_path: D:\Program Files\Node\uninstall.exe
PublicConfig.py脚本: 配置读取信息,方便调用
import os
from Public_Utils.util_yaml import YamlReader
class YamlPath:
def __init__(self):
current = os.path.abspath(__file__)
self.base_dir = os.path.dirname(os.path.dirname(current))
def get_exe_yaml_file(self):
_config_path = self.base_dir + os.sep + "Public_Config\Public_yaml"
self._config_file = _config_path + os.sep + "Exe.yaml"
return self._config_file
class ConfigYaml:
def __init__(self): #初始yaml读取配置文件
self.exe_config = YamlReader(YamlPath().get_exe_yaml_file()).yaml_data()
def get_exe_process_name(self):
return self.exe_config['EXE']['exe_process_name']
def get_exe_path(self):
return self.exe_config['EXE']['exe_path']
def get_exe_install_path(self):
return self.exe_config['EXE']['exe_install_path']
def get_exe_uninstall_path(self):
return self.exe_config['EXE']['exe_uninstall_path']
if __name__ == '__main__':
pass
ExE.py执行脚本 其中函数包括
def win_process() 杀进程
def install_exe() 静默安装exe程序
def uninstall_exe() 静默卸载exe程序
import ctypes
import os
import psutil
import subprocess
from Public_Config.PublicConfig import ConfigYaml
class ExE:
def win_process(self):
for process in psutil.process_iter():
'''获取所有进程列表'''
try:
processinfo = process.as_dict(attrs=['pid','name'])
'''获取所有进程详情,并根据进程名匹配杀掉进程'''
if processinfo['name'] == ConfigYaml().get_exe_process_name():
process.kill()
except psutil.NoSuchProcess:
pass
def install_exe(self):
'''安装exe程序到指定的目录下'''
cmd = f'{ConfigYaml().get_exe_path()} /S /D={ConfigYaml().get_exe_install_path()}'
result = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
'''
通过subprocess模块以静默方式安装exe程序到指定的目录下
exe_path = 实际的安装程序存放路径
/S 静默模式安装
install_path = 安装到指定的目录
'''
if result.returncode == 0:
print("exe has installed")
else:
print(result.stderr.decode("cp936"))
def uninstall_exe(self): #根据exe程序自带的uninstall.exe卸载
if os.name == 'nt':
if ctypes.windll.shell32.IsUserAnAdmin() != 1:
raise Exception('权限不足,无法卸载程序!')
result = subprocess.run([ConfigYaml().get_exe_install_path(), '/S'], stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True)
if result.returncode == 0:
print("exe has uninstalled")
else:
print(result.stderr.decode("cp936"))
if __name__ == '__main__':
pass
util_yaml.py
import os
import yaml
class YamlReader:
#初始化,判断文件是否存在
def __init__(self,yaml_file):
if os.path.exists(yaml_file):
self.yaml_file = yaml_file
else:
raise FileNotFoundError("yaml文件不存在")
self._data = None
self._data_all = None
def yaml_data(self): #yaml文件读取 --单个文档读取
#第一次调用data,读取yaml文档,如果不是,直接返回之前保存的数据
if not self._data:
with open(self.yaml_file,'rb') as f:
self._data = yaml.safe_load(f)
return self._data
def yaml_data_all(self): #多个文档的读取
if not self._data_all:
with open(self.yaml_file,'rb') as f:
self._data_all = yaml.safe_load_all(f)
return self._data_all
猜你喜欢
- 2024-09-29 Hexo历险记之二多系统安装Node(小人历险记森林深处电脑版免安装)
- 2024-09-29 Win7环境下成功安装Nodejs18.16.1
- 2024-09-29 个人云笔记系统搭建(针对window操作系统)
- 2024-09-29 Npm 安装提示 EUNSUPPORTEDPROTOCOL 错误
- 2024-09-29 一个优雅的将NodeJS项目打包成跨平台可执行文件的神器——pkg
- 2024-09-29 Skywalking的编译打包(skywalking java)
- 2024-09-29 windows 安装 node-canvas(windows安装node环境)
- 2024-09-29 Gatlab 10.4.6中挖矿病毒处理与升级过程记录
- 2024-09-29 json - server:mock接口工具使用(mock-server.js)
- 2024-09-29 用一次就会爱上的cli工具开发(cli 工具)
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- c语言min函数头文件 (77)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 无效的列索引 (74)