Inno Setup覆盖安装前执行卸载、获取原安装路径
分享下目前用到的一个简单的 Inno Setup 安装包制作脚本:
主要功能有3个:
- 安装前检测是否已安装,如果是覆盖安装则提示是否先进行卸载(程序卸载时不会自动卸载打包列表外的文件,目前没有进行历史数据的清除)
- 安装和卸载时检测程序是否正在执行,目前没有提供强制结束程序的操作,不过可以百度到
- 获取原来的安装路径(通过注册表),设置为当前的的默认安装路径
路径问题参照了两个博客:
inno setup读取注册表遇到的一个坑 - 24K纯开源 - 博客园
Innosetup 打包安装exe 读取上次安装路径_c1007857613的专栏-CSDN博客
;有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
//分号注释会在预处理器输出中,斜杠注释不会
//先定义一些常量
//程序名
#define MyAppName "程序名"
//程序图标路径,相对于iss脚本的相对路径
#define MyAppIcon "logo.ico"
//程序版本号
#define MyAppVersion "1.0.0"
// 发行者
#define MyAppPublisher "公司"
//网址
#define MyAppURL "https://www.gongsi.com/"
//可执行程序名
#define MyAppExeName "app.exe"
//待打包的文件路径,相对于iss脚本的相对路径
#define MyAppExePath "client\bin"
//程序默认安装目录
#define MyAppInstallPath "D:\folder\sub"
//程序uuid,点工具生成唯一的GUID
#define MyUid "0000-0000-0000-0000-0000"[Setup]
//[Setup]-该区段包含用于安装程序和卸载程序的全局设置
;注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
//每个程序单独一个id,这是会作为注册表key的,别混用
AppId={{{#MyUid}}
//程序安装后的名字
AppName={#MyAppName}
//程序版本号
AppVersion={#MyAppVersion}
//AppVerName={#MyAppName} {#MyAppVersion}
//默认安装目录
DefaultDirName={#MyAppInstallPath}
//使用已安装版本的目录安装,为yes则默认选择已有的目录且不能选择
UsePreviousAppDir=no
//不显示选择开始菜单文件夹 向导页面
DisableProgramGroupPage=yes
//以管理权限运行安装
PrivilegesRequired=admin
//安装包生成后所在文件夹和文件名
OutputDir=install\{#MyAppVersion}
OutputBaseFilename={#MyAppName} V{#MyAppVersion}
//选择压缩方法,lzma为7z
Compression=lzma
//启用固态压缩,详见文档
SolidCompression=yes
//安装和卸载程序现代外观
//WizardStyle=modern
//指定安装和卸载程序图标
SetupIconFile={#MyAppIcon}
//控制面板卸载图标
UninstallDisplayIcon={#MyAppIcon}
//开始菜单分组,see[Icons]区段
//DefaultGroupName={#MyAppPublisher}\by
//控制面板-添加/删除页面中的程序相关信息
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}[Languages]
//[Languages]-定义安装程序中可使用的语言
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"[Tasks]
//[Tasks]-定义安装程序在执行安装期间所有由用户定制的任务。这些任务以选项框和单选项形式在附加任务向导页面中出现。
//创建桌面图标
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkablealone[Files]
//[Files]-这是定义安装程序安装文件到用户系统中的可选文件区段
Source: "{#MyAppExePath}\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyAppExePath}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
//注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”[Icons]
//[Icons]-定义所有创建在开始菜单和/或其它位置(比如桌面)的快捷方式
//see[Setup]区段DefaultGroupName设置
//使用菜单分组
//Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename:"{app}\{#MyAppIcon}"
//Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; IconFilename:"{app}\{#MyAppIcon}"
//Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; IconFilename:"{app}\{#MyAppIcon}"
//没有菜单分组
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename:"{app}\{#MyAppIcon}"
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon; IconFilename:"{app}\{#MyAppIcon}"[Run]
// [Run]- 用来指定在程序完成安装后,在安装程序显示最终对话框前要执行的一些程序
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent[Code]
//[Code]-指定 Pascal 脚本的可选区段
//路径参照两个博客:
//https://blog.csdn.net/c1007857613/article/details/81475167
//https://www.cnblogs.com/csuftzzk/p/innosetup_read_registry.html
//全局变量保存安装路径
var globalInstallPath: String;//初始化时把路径设置到编辑框
procedure InitializeWizard;
beginWizardForm.DirEdit.Text := globalInstallPath;
end;//检测程序是否运行
function IsAppRunning(const FileName: string): Boolean;
varFWMIService: Variant;FSWbemLocator: Variant;FWbemObjectSet: Variant;
beginResult := false;FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));Result := (FWbemObjectSet.Count > 0);FWbemObjectSet := Unassigned;FWMIService := Unassigned;FSWbemLocator := Unassigned;
end;//获取历史安装路径,Inno Setup保存的一些信息可自己在注册表中查看
//64位会映射到:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall
function GetInstallString(): String;
varInstallPath: String;
beginInstallPath := '{#MyAppInstallPath}';if RegValueExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#MyUid}}_is1', 'Inno Setup: App Path') thenbeginRegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#MyUid}}_is1', 'Inno Setup: App Path', InstallPath)end;result := InstallPath;
end;//准备安装
function InitializeSetup(): Boolean;
var ResultStr: String; ResultCode: Integer;
begin globalInstallPath := GetInstallString();result := IsAppRunning('{#MyAppExeName}');if result thenbeginMsgBox('检测到{#MyAppName}正在运行,请先关闭程序后重试! ', mbError, MB_OK); result:=false;endelse if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#MyUid}}_is1', 'UninstallString', ResultStr) thenbegin if MsgBox('是否卸载已安装的{#MyAppName},并保留历史数据?', mbConfirmation, MB_YESNO) = IDYES thenbegin ResultStr := RemoveQuotes(ResultStr); Exec(ResultStr, '/silent', '', SW_HIDE, ewWaitUntilTerminated, ResultCode); end;result:=true;endelsebeginresult:=true; end;
end;//准备卸载
function InitializeUninstall(): Boolean;
beginresult := IsAppRunning('{#MyAppExeName}');if result thenbeginMsgBox('检测到{#MyAppName}正在运行,请先关闭程序后重试! ', mbError, MB_OK); result:=false;endelsebeginresult:=true;end
end;
Inno Setup覆盖安装前执行卸载、获取原安装路径相关推荐
- 安装php5、卸载php、安装php7的教程
首先安装php5很简单 yum install php 然后如果不想用php5的话那就卸载吧 注意只使用yum remove命令是行不通的 那我们先 yum remove php 然后你需要 ...
- contos6.5卸载php7,centos安装php5、卸载php、安装php7的教程
首先安装php5很简单 yum install php 然后如果不想用php5的话那就卸载吧 注意只使用yum remove命令是行不通的 那我们先 yum remove php 然后你需要 rpm ...
- Android如何打开未安装的apk,android获取未安装的APK文件的信息
下面从一个未安装的android的apk文件获取apk信息 /** * 获取未安装的apk信息 * * @param ctx Context * @param apkPath apk路径,可以放在SD ...
- 重装MS SQL Server 2000前必须彻底删除原安装文件!
今天重装MS SQL Server 2000,装了几次都提示出错,查看事件,显示 driver={sql server};server=harry;UID=sa;PWD=;database=maste ...
- (转)Inno Setup入门(八)——有选择性的安装文件
本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250827 这主要使用[Components]段实现,一个演示的代 ...
- Inno setup打包软件安装
Inno setup打包软件特点是开源.简单.重点还是免费的. 软件下载官网 https://jrsoftware.org/isinfo.php 界面汉化包地址:https://jrsoftware. ...
- 【夏虫语冰】开源软件安装包制作工具(NSIS,Inno Setup)
文章目录 1.NSIS 1.1 软件简介 1.2 下载安装 1.3 代码示例 2.Inno Setup 2.1 软件简介 2.2 下载安装 2.3 代码示例 结语 1.NSIS 官网地址: https ...
- 使用exe4j+inno setup打包exe文件踩坑记录
一.前言 最近用Java给朋友写了一个截图工具和将所有图片生成pdf工具,但是由于朋友不是计算机行业的人员,如果为了使用java常见的运行方式运行工具,则还需要在电脑上安装jdk与jre,着实不方便. ...
- Inno Setup 制作exe安装包
Inno Setup 制作exe安装包 前言: 使用Inno Setup制作exe安装包,首先需要一个可运行的exe程序,然后下载Inno Setup工具,最后才是制作安装包的过程. exe主程序 此 ...
最新文章
- ECMAScript6入门--Class对象
- python list学习笔记
- ngin配置301重定向设置方法和nginx子目录301重定向
- Redis: under the hood---转载
- Git命令按人统计提交次数和代码量
- 机器学习之——学习率
- 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...
- rotate array_Array.rotate! Ruby中的示例方法
- layui+strust2多文件上传
- Linux系统centos6.7上安装libevent
- 智慧城市热度不减 产业资本进军智能汽车相关领域
- JavaScript全套视频教程
- 手把手教你迁移微信小程序到 QQ 浏览器
- PCA9685 多舵机控制器的编程
- 各个国家的货币符号和英文缩写全解析
- 「docker实战篇」python的docker爬虫技术-python脚本app抓取(13)
- 我从来都不是什么好人——脚本小子智斗绿茶小妹
- 【亲测有效】C盘扩展卷灰色的解决办法
- 【附源码】计算机毕业设计JAVA校园代办业务系统
- 协方差、协方差矩阵定义与计算