分享下目前用到的一个简单的 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覆盖安装前执行卸载、获取原安装路径相关推荐

  1. 安装php5、卸载php、安装php7的教程

    首先安装php5很简单  yum install php  然后如果不想用php5的话那就卸载吧 注意只使用yum remove命令是行不通的  那我们先  yum remove php  然后你需要 ...

  2. contos6.5卸载php7,centos安装php5、卸载php、安装php7的教程

    首先安装php5很简单 yum install php 然后如果不想用php5的话那就卸载吧 注意只使用yum remove命令是行不通的 那我们先 yum remove php 然后你需要 rpm ...

  3. Android如何打开未安装的apk,android获取未安装的APK文件的信息

    下面从一个未安装的android的apk文件获取apk信息 /** * 获取未安装的apk信息 * * @param ctx Context * @param apkPath apk路径,可以放在SD ...

  4. 重装MS SQL Server 2000前必须彻底删除原安装文件!

    今天重装MS SQL Server 2000,装了几次都提示出错,查看事件,显示 driver={sql server};server=harry;UID=sa;PWD=;database=maste ...

  5. (转)Inno Setup入门(八)——有选择性的安装文件

    本文转载自:http://blog.csdn.net/yushanddddfenghailin/article/details/17250827 这主要使用[Components]段实现,一个演示的代 ...

  6. Inno setup打包软件安装

    Inno setup打包软件特点是开源.简单.重点还是免费的. 软件下载官网 https://jrsoftware.org/isinfo.php 界面汉化包地址:https://jrsoftware. ...

  7. 【夏虫语冰】开源软件安装包制作工具(NSIS,Inno Setup)

    文章目录 1.NSIS 1.1 软件简介 1.2 下载安装 1.3 代码示例 2.Inno Setup 2.1 软件简介 2.2 下载安装 2.3 代码示例 结语 1.NSIS 官网地址: https ...

  8. 使用exe4j+inno setup打包exe文件踩坑记录

    一.前言 最近用Java给朋友写了一个截图工具和将所有图片生成pdf工具,但是由于朋友不是计算机行业的人员,如果为了使用java常见的运行方式运行工具,则还需要在电脑上安装jdk与jre,着实不方便. ...

  9. Inno Setup 制作exe安装包

    Inno Setup 制作exe安装包 前言: 使用Inno Setup制作exe安装包,首先需要一个可运行的exe程序,然后下载Inno Setup工具,最后才是制作安装包的过程. exe主程序 此 ...

最新文章

  1. ECMAScript6入门--Class对象
  2. python list学习笔记
  3. ngin配置301重定向设置方法和nginx子目录301重定向
  4. Redis: under the hood---转载
  5. Git命令按人统计提交次数和代码量
  6. 机器学习之——学习率
  7. 计蒜客可以做计算机编程吗,如果你的编程能力不足以支撑你成为工程师的野心,不妨到计蒜客上学学看...
  8. rotate array_Array.rotate! Ruby中的示例方法
  9. layui+strust2多文件上传
  10. Linux系统centos6.7上安装libevent
  11. 智慧城市热度不减 产业资本进军智能汽车相关领域
  12. JavaScript全套视频教程
  13. 手把手教你迁移微信小程序到 QQ 浏览器
  14. PCA9685 多舵机控制器的编程
  15. 各个国家的货币符号和英文缩写全解析
  16. 「docker实战篇」python的docker爬虫技术-python脚本app抓取(13)
  17. 我从来都不是什么好人——脚本小子智斗绿茶小妹
  18. 【亲测有效】C盘扩展卷灰色的解决办法
  19. 【附源码】计算机毕业设计JAVA校园代办业务系统
  20. 协方差、协方差矩阵定义与计算

热门文章

  1. 坚果U1和当贝X3哪款激光投影仪值得买,一篇明白哪个好
  2. adobe都有什么软件
  3. 机器学习:基于随机森林(RFC)对酒店预订分析预测
  4. nvidia 显卡驱动安装,以及解决驱动无法正确加载的问题
  5. idea创建maven白板后跑报404解决
  6. iOS开发之CocoaAsyncSocket使用
  7. 我的世界基岩版服务端 更换地图教程 minecraft bedrock 更换地图教程
  8. Day07 数据类型(下)
  9. Qt文件对话框:QFileDialog入门教程
  10. NHANES数据库权重计算