简介:Advanced Installer 22.5 打包 Windows 安装包资源,面向需要制作专业安装程序的软件开发者与运维人员,帮助将应用程序、依赖文件及安装配置整合为可安装、可卸载、易管理的 Windows 安装包。压缩包共约 2000 个文件,整体约 229.56MB,以 png、jpg、ico 等界面与图标素材,aip、aitemplate 工程模板,xsd、xml、json 配置定义,以及 rtf、html、txt 说明文档为主,另含 msi、msm、exe 等安装产物与脚本文件,覆盖从界面资源到打包配置的完整结构。已有 1435 人学习下载,适合希望掌握图形化打包流程、静默安装与命令行模式、安装条件设置及测试验证的读者参考。资源包含多语言界面文件与模板,便于对照定制安装向导、快捷方式、注册表项及先决条件检查,为构建稳定一致的安装体验提供完整素材。
1. 从一次翻车说起:Advanced Installer 22.5 到底解决什么问题
上个月帮朋友公司做一个内部工具的交付,需求很朴素:把一套 .NET 桌面程序打成 exe 安装包,双击就能装,装完桌面有快捷方式,开始菜单能卸载。我一开始图省事,直接拿 Visual Studio 自带的 Installer 项目凑合,结果在 Win11 上装到一半弹「Windows Installer 服务不可用,请重启系统」,重启了三次照样翻车。后来换成 Advanced Installer 22.5,从建工程到出包不到四十分钟,连注册表写入、服务安装、前置依赖检测都一次过。
Advanced Installer 是一款 Windows 平台上的安装包制作工具,22.5 是它较新的一个版本。它的核心价值在于:把 MSI 和 EXE 两种安装格式的复杂度封装成可视化工程,你不用手写 WiX 的 XML,也不用去啃 InstallShield 那套脚本,就能做出带界面、带依赖检测、带升级逻辑的安装包。它适合谁?一是需要给客户交付桌面软件的开发者,二是做企业内部工具分发、需要静默安装和批量部署的运维,三是被 VS Installer 和 Inno Setup 的边界卡住、想找一个中间档方案的人。这篇笔记就按「建工程 → 配参数 → 出包 → 排错」的顺序,把我踩过的坑和能直接抄的配置写清楚。
2. 工程建立与安装类型选型:MSI 还是 EXE,先想清楚再动手
2.1 为什么默认推荐 EXE 而不是裸 MSI
Advanced Installer 新建工程时会让你选安装类型,常见的有 Professional、Enterprise、Architect 等版本对应的模板,但真正影响你后续工作量的,是「Package Type」这一项:MSI、EXE、MSI 加 EXE 引导程序。很多人第一反应是选 MSI,觉得原生、干净、方便组策略推送。但实际交付给普通用户时,裸 MSI 有个硬伤:它不能自带前置依赖的安装逻辑。比如你的程序依赖 .NET 6 运行时,用户机器上没有,MSI 只会弹一句「缺少依赖」然后退出,用户一脸懵。
EXE 引导程序(Bootstrapper)的本质是:外面套一层可执行壳,先按你定义的顺序检查并安装前置条件,全部满足后再调用内嵌的 MSI 执行真正的安装。常见做法是选「EXE setup with resources next to it」或者「Single EXE setup」,前者把 MSI 和依赖文件放在同目录,后者全部塞进一个 exe。我一般交付给外部客户用 Single EXE,内部批量部署用 MSI,因为内部机器镜像里依赖早就打好了。
选型判断可以按这张表走:
| 场景 | 推荐类型 | 理由 |
|---|---|---|
| 交付外部客户、依赖不确定 | Single EXE | 自带依赖检测,双击即装 |
| 企业内部组策略推送 | 纯 MSI | 便于 GPO 和 SCCM 静默分发 |
| 需要自定义安装界面 | EXE + 内嵌 MSI | 引导程序可做界面,MSI 做实际写入 |
| 需要支持静默安装 | 两者皆可 | 加/qn或/exenoui参数 |
2.2 建工程时的四个关键填写项
打开 Advanced Installer 22.5,新建工程后左侧是导航树,右侧是属性面板。第一遍做的时候别急着点下一步,先把这几项填对:
- Product Name:会写进注册表卸载项和开始菜单,别用中文加特殊符号,空格可以有,但
&、%这类字符会在某些系统上导致卸载项显示异常。 - Product Version:格式必须是
x.y.z,22.5 对版本号校验比老版本严,写成1.0它会自动补成1.0.0,但如果你写1.0.0.0四段,某些升级场景会匹配不上。 - Manufacturer:公司名,会出现在「应用和功能」列表里,建议和代码签名证书的 Subject 保持一致。
- Installation Type:按上一节的结论选。
填完之后,在「Install Parameters」页里确认安装路径变量。默认是[ProgramFilesFolder][Manufacturer][ProductName],如果你想让用户能改路径,勾上「Allow user to change installation path」;如果做静默部署,这个勾要去掉,否则静默模式下路径变量可能取不到值。
2.3 用命令行建工程的思路(适合批量场景)
Advanced Installer 支持用命令行调它的工程文件,常见做法是先用 GUI 建一个模板.aip,然后用AdvancedInstaller.com这个 CLI 工具做批量替换。比如你有十个内部工具要打包,只有版本号和源目录不同,就可以写脚本:
:: 假设 Advanced Installer 装在默认路径 set AI_CLI="C:\Program Files (x86)\Caphyon\Advanced Installer 22.5\bin\x86\AdvancedInstaller.com" :: 用模板工程,替换版本号和源路径,重新构建 %AI_CLI% /edit "D:\pack\Template.aip" ^ /SetVersion 2.3.1 ^ /SetProperty SOURCEDIR="D:\build\ToolA" ^ /SetProperty PRODUCTNAME="ToolA" :: 构建 MSI %AI_CLI% /build "D:\pack\Template.aip"这段脚本的逻辑是:/edit打开工程并修改属性,/SetVersion改版本号,/SetProperty改自定义属性(前提是模板里已经把源目录和产品名做成了属性引用),/build触发构建。参数说明:^是 Windows 批处理的换行符,路径里有空格必须加引号。注意/SetProperty只能改已经在工程里定义过的属性,临时造一个属性名是无效的,这是新手最容易翻车的地方——以为随便写个名字就能注入,结果构建出来还是模板的旧值。
3. 文件、注册表与依赖配置:把「装什么」落到具体条目
3.1 添加文件和文件夹的正确姿势
左侧导航树里「Files and Folders」页是核心。很多人直接把整个bin\Release拖进去,结果发现配置文件、日志目录、临时文件全被打进去了。正确做法是分三层:
第一层,应用程序文件,放[ProgramFilesFolder][Manufacturer][ProductName],这些是只读的 exe 和 dll。第二层,用户配置模板,放[CommonAppDataFolder][Manufacturer][ProductName],首次启动时程序从这里拷贝到用户目录。第三层,快捷方式,在「Shortcuts」页单独建,指向第一层的 exe。
添加文件时注意「File Properties」里的几个选项:
- Read-only:勾上后安装完文件是只读的,防止用户误改,但如果你程序运行时要写同目录的日志,别勾。
- Permanent:勾上后卸载时不会删除该文件,用于保留用户数据,慎用,容易留下垃圾。
- Never overwrite:升级安装时如果目标文件已存在就跳过,适合配置文件。
3.2 注册表写入的两种方式
Advanced Installer 写注册表有两条路:一是在「Registry」页手动建键值,二是在「Custom Actions」里用脚本写。手动建适合静态键值,比如文件关联、协议注册。举个例子,注册一个自定义协议myapp://:
HKEY_CLASSES_ROOT\myapp (Default) = "URL:myapp Protocol" "URL Protocol" = "" HKEY_CLASSES_ROOT\myapp\shell\open\command (Default) = "[APPDIR]MyApp.exe" "%1"在 Registry 页里逐级新建,注意[APPDIR]是 Advanced Installer 的路径变量,构建时会替换成实际安装目录。%1是传入的 URL 参数,必须带引号,否则路径里有空格时协议调用会失败。
动态键值就用 Custom Action,比如安装时把当前时间写进注册表:
// Custom Action: JScript,在 InstallFiles 之后执行 var shell = new ActiveXObject("WScript.Shell"); var key = "HKLM\\SOFTWARE\\MyCompany\\MyApp\\InstallTime"; var now = new Date().toLocaleString(); shell.RegWrite(key, now, "REG_SZ");逻辑说明:这段脚本在安装文件写完后运行,往 HKLM 写一个安装时间戳。参数说明:RegWrite第三个参数是类型,REG_SZ是字符串;如果要写 DWORD 用REG_DWORD并传整数。注意 Custom Action 的执行时机(Execution Time)要选对,选「Commit」阶段写注册表最稳,选「InstallFiles」之前可能路径还没建好。
3.3 前置依赖检测:.NET 运行时和 VC++ 库
这是 Advanced Installer 比 VS Installer 强的地方。在「Prerequisites」页,你可以勾选常见的依赖项,比如 .NET Desktop Runtime 6.0、Visual C++ 2015-2022 Redistributable。勾上之后,构建时它会把这些依赖的安装包一起打进去,安装时先检测,缺了就先装。
关键参数在「Prerequisite Properties」里:
- Install Condition:检测条件,比如
(VersionNT >= 603)表示 Win8 以上才装。 - Run as admin:装运行时需要管理员权限,必须勾。
- Continue with main install if prerequisite fails:这个千万别勾,依赖装不上主程序装了也跑不起来。
我一般会额外加一个「Launch Condition」,在「Launch Conditions」页里写:如果检测到系统是 Win7 且没装 .NET 6,直接弹提示并终止安装,而不是让用户装到一半失败。条件表达式类似(VersionNT >= 1000) OR (NETFRAMEWORK6INSTALLED),具体变量名在 Advanced Installer 的文档里有,22.5 版本对 .NET 6 的检测变量支持是完整的。
4. 界面定制与静默安装:让安装包能看也能藏
4.1 安装界面的主题和对话框顺序
Advanced Installer 自带几套主题,在「Themes」页选。默认主题够用,但如果你要改对话框顺序,得去「Dialogs」页。常见需求是:把「安装路径选择」对话框去掉,强制装到默认目录。操作是找到FolderDlg,把它的「Display」属性改成False,或者在「Sequence」里把它拖出流程。
改对话框有个血泪经验:别在「First Time Install」和「Maintenance」两个序列里用同一套对话框配置。升级安装时如果还弹「欢迎使用安装向导」,用户会以为装了个新软件。正确做法是在「Dialogs」页里针对「Maintenance」模式单独配一套精简对话框,只保留「修复」和「卸载」两个选项。
4.2 静默安装参数与日志开关
做批量部署时,静默安装是刚需。Advanced Installer 生成的 EXE 和 MSI 都支持标准参数:
:: EXE 引导程序静默安装,并输出日志 MyAppSetup.exe /exenoui /qn /L*v "C:\temp\install.log" :: 纯 MSI 静默安装 msiexec /i MyApp.msi /qn /L*v "C:\temp\install.log" :: 静默卸载 msiexec /x MyApp.msi /qn参数说明:/exenoui告诉引导程序不显示自己的界面,/qn是 MSI 的完全静默,/L*v输出详细日志,*表示所有日志类型,v是详细级别。日志路径建议用绝对路径,相对路径在 SYSTEM 账户下执行时会写到C:\Windows\System32里,找起来很麻烦。
静默安装最容易翻车的是权限。如果通过 SCCM 或计划任务以 SYSTEM 账户运行,安装路径变量[ProgramFilesFolder]能正常解析,但如果你在脚本里用了%USERPROFILE%这类用户变量,SYSTEM 账户下会解析成C:\Windows\System32\config\systemprofile,导致文件装错地方。解决办法是静默安装时不要依赖用户级变量,全部用机器级路径。
4.3 用响应文件做可复现的静默配置
如果静默安装的参数很多,每次敲命令行容易漏,可以用响应文件。Advanced Installer 支持/i配合一个.ini文件:
[Install] ProductName=MyApp Version=2.3.1 InstallDir=C:\Program Files\MyCompany\MyApp CreateDesktopShortcut=1 LaunchAfterInstall=0然后在命令行里引用:
MyAppSetup.exe /exenoui /qn /i "D:\deploy\config.ini"逻辑说明:响应文件把安装选项固化下来,适合多台机器重复部署。参数说明:/i后面跟 ini 路径,ini 里的键名要和工程里定义的属性名一致,否则会被忽略。注意 ini 文件编码要用 ANSI 或 UTF-8 无 BOM,带 BOM 的 UTF-8 在某些版本上会解析出乱码,导致中文路径失败。
5. 避坑与排查:五个真实翻车记录
5.1 现象:安装到一半弹「Windows Installer 服务不可用,请重启系统」
原因:这个报错和 Advanced Installer 本身关系不大,通常是目标机器上 Windows Installer 服务被禁用,或者C:\Windows\Installer目录权限异常。还有一种情况是之前装过同 ProductCode 的旧版本,注册表残留导致新安装无法接管。
解决:先services.msc确认 Windows Installer 服务是「手动」或「自动」且能启动。如果服务正常,用msiexec /unregister再msiexec /regserver重新注册。最后检查C:\Windows\Installer目录,如果权限被改过,恢复 SYSTEM 和 Administrators 的完全控制权限。预防办法是在 Advanced Installer 里给每次构建生成新的 ProductCode,别复用。
5.2 现象:升级安装后,旧版本的文件还在,新旧混用
原因:Advanced Installer 默认的升级逻辑依赖「Upgrades」页里的配置。如果你只改了版本号,没在「Upgrades」页添加升级规则,安装包会当成全新安装,装到另一个目录,或者覆盖不彻底。
解决:在「Upgrades」页勾选「Customize upgrade rules」,添加一条规则:检测到任意旧版本就执行「Uninstall old version」再「Install new version」。注意卸载旧版本时如果旧版的卸载程序损坏,会卡住,这时候要在规则里加「Force uninstall」选项。我一般还会在「Launch Conditions」里加一条:如果检测到比当前版本更高的版本已安装,直接终止,防止降级安装。
5.3 现象:快捷方式图标是白板,或者指向错误
原因:快捷方式图标路径用了相对路径,或者图标文件没被打进安装包。Advanced Installer 里快捷方式的 Icon 属性如果填的是app.ico,构建时它会在工程目录找,但安装后快捷方式引用的是安装目录下的图标,如果图标没被添加到「Files and Folders」里,就会白板。
解决:把图标文件加到「Files and Folders」的应用程序目录,然后在快捷方式属性里用[APPDIR]app.ico引用。另外注意图标文件必须是.ico格式,.png改后缀不行,Windows 不认。
5.4 现象:静默安装返回 0 但程序没装上
原因:/qn静默模式下,如果安装过程中弹了任何需要交互的对话框(比如「是否覆盖文件」),安装会直接失败但返回码可能还是 0。另外如果前置依赖安装失败但主安装继续执行,也会出现「返回成功但没装全」。
解决:静默安装一定要加/L*v日志,装完检查日志里有没有Return value 3或Installation success or error status: 1603。1603 是 MSI 的通用失败码,具体原因看日志里最后几行。预防办法是在「Prerequisites」里把「Continue with main install if prerequisite fails」取消勾选,依赖失败就整体失败。
5.5 现象:安装包在 Win11 上被 SmartScreen 拦截
原因:没有代码签名。Advanced Installer 生成的 exe 即使内容合法,没有签名证书也会触发 SmartScreen 警告。这不是 Advanced Installer 的问题,是 Windows 的安全机制。
解决:买一张代码签名证书(OV 或 EV),在 Advanced Installer 的「Digital Signature」页配置签名。EV 证书能立即获得 SmartScreen 信任,OV 证书需要积累下载量。如果只是内部使用,可以在目标机器上把安装包加入白名单,或者用组策略关闭 SmartScreen 对特定路径的检查。注意签名要在构建的最后一步做,先签名再打包会导致签名失效。
6. 进阶技巧:用 PowerShell 做安装后验证与回滚
安装包做完不是终点,交付之后怎么确认装对了、装错了怎么回滚,才是区分熟练工和新手的地方。我现在的习惯是:每个安装包配一个 PowerShell 验证脚本,装完自动跑一遍,检查文件、注册表、服务、快捷方式四项。
# Verify-Install.ps1 $ErrorActionPreference = "Stop" $result = @() # 1. 检查主程序文件 $exePath = "C:\Program Files\MyCompany\MyApp\MyApp.exe" if (Test-Path $exePath) { $result += "OK: 主程序存在" } else { $result += "FAIL: 主程序缺失 $exePath" } # 2. 检查注册表卸载项 $regPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{你的ProductCode}" if (Test-Path $regPath) { $ver = (Get-ItemProperty $regPath).DisplayVersion $result += "OK: 注册表版本 $ver" } else { $result += "FAIL: 注册表卸载项缺失" } # 3. 检查服务状态(如果装了服务) $svc = Get-Service -Name "MyAppService" -ErrorAction SilentlyContinue if ($svc -and $svc.Status -eq "Running") { $result += "OK: 服务运行中" } elseif ($svc) { $result += "WARN: 服务存在但状态为 $($svc.Status)" } else { $result += "FAIL: 服务未安装" } # 4. 检查桌面快捷方式 $lnk = "$env:PUBLIC\Desktop\MyApp.lnk" if (Test-Path $lnk) { $result += "OK: 桌面快捷方式存在" } else { $result += "FAIL: 桌面快捷方式缺失" } $result | ForEach-Object { Write-Host $_ } if ($result -match "FAIL") { exit 1 } else { exit 0 }这段脚本的逻辑是逐项检查安装结果,任何一项 FAIL 就返回非零退出码,方便在 CI 或部署脚本里判断。参数说明:$env:PUBLIC是公共桌面路径,对应所有用户可见的快捷方式;{你的ProductCode}要替换成 Advanced Installer 工程里实际的 ProductCode,在「Product Details」页能看到。注意 ProductCode 每次构建如果重新生成,脚本里的硬编码就会失效,所以要么固定 ProductCode,要么在构建时把 ProductCode 写进一个配置文件让脚本读取。
回滚方面,Advanced Installer 本身支持在安装失败时自动回滚(MSI 的标准行为),但前提是失败发生在 MSI 执行阶段。如果失败发生在 EXE 引导程序的前置依赖安装阶段,MSI 还没开始,就没有回滚可言。我的做法是在部署脚本里加一层:先跑安装,再跑验证脚本,验证失败就调msiexec /x卸载,然后重新装旧版本。旧版本的安装包要提前放在部署目录里,别等出问题了再去下载。
还有一个容易被忽略的点:安装日志的归档。每次静默安装都把/L*v日志按机器名和时间戳存一份,出问题时直接翻日志,比远程连过去复现快得多。我一般用\\fileserver\logs\MyApp\%COMPUTERNAME%_%DATE%.log这种路径,注意%DATE%里有斜杠,要先替换成短横线。
从那以后我每次做完安装包,都强制走一遍「静默装 → 验证脚本 → 静默卸 → 再装」的循环,确认升级和卸载路径都干净,才敢交付。希望帮到你。
本文还有配套的精品资源,点击获取